Android: Intent.ACTION_SEND с EXTRA_STREAM не прикрепляет изображения при выборе приложения Gmail на htc Hero

В эмуляторе с почтовым приложением по умолчанию все работает нормально. Но у меня нет прикрепления, когда я получаю почту, которую я отправил из своего героя, используя приложение Gmail. Приложение Mail по умолчанию для героя отлично работает.

Как я могу заставить этот код работать с приложением Gmail на Hero?
Вы можете увидеть код ниже.

    private void startSendIntent() {
        Bitmap bitmap = Bitmap.createBitmap(editableImageView.getWidth(), editableImageView.getHeight(), Bitmap.Config.RGB_565);
        editableImageView.draw(new Canvas(bitmap));
        File png = getFileStreamPath(getString(R.string.file_name));
        FileOutputStream out = null;
        try {
            out = openFileOutput(getString(R.string.file_name), MODE_WORLD_READABLE);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) out.close();
            }
            catch (IOException ignore) {}
        }
        final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
        emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(png));
        emailIntent.setType("image/png");
        startActivity(Intent.createChooser(emailIntent, getString(R.string.send_intent_name)));
}

в журналах я вижу следующее:

02-05 17:03:37.526: DEBUG/Gmail(11511): URI FOUND:file:///sdcard/DCIM/100MEDIA/IMAG0001.jpg
02-05 17:03:37.535: DEBUG/Gmail(11511): ComposeActivity added to message:0 attachment:|IMAG0001.jpg|image/jpeg|0|image/jpeg|LOCAL_FILE|file:///sdcard/DCIM/100MEDIA/IMAG0001.jpg size:0
02-05 17:03:37.585: INFO/Gmail(11511): >>>>> Attachment uri: file:///sdcard/DCIM/100MEDIA/IMAG0001.jpg
02-05 17:03:37.585: INFO/Gmail(11511): >>>>>           type: image/jpeg
02-05 17:03:37.585: INFO/Gmail(11511): >>>>>           name: IMAG0001.jpg
02-05 17:03:37.585: INFO/Gmail(11511): >>>>>           size: 0

Спасибо за ответ.

Ответ 1

Для меня проблема была решена со следующими строками кода:

Bitmap screenshot = Bitmap.createBitmap(_rootView.getWidth(), _rootView.getHeight(), Bitmap.Config.RGB_565);
_rootView.draw(new Canvas(screenshot));

String path = Images.Media.insertImage(getContentResolver(), screenshot, "title", null);
Uri screenshotUri = Uri.parse(path);

final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
emailIntent.setType("image/png");

startActivity(Intent.createChooser(emailIntent, "Send email using"));

Главное, что я сохраняю экранный снимок в медиа-библиотеке, а затем он может успешно отправить файл оттуда.

Ответ 2

getFileStreamPath() или openFileOutput() создадут файлы в приватном каталоге, недоступном для других приложений (например, Gmail). Используйте внешнее хранилище для создания общедоступных файлов:

private static final int REQUEST_SHARE = 39714;

private File png = null;

private void startSendIntent() {
    png = new File(new File(Environment.getExternalStorageDirectory(), "Pictures"), getString(R.string.file_name));

    FileOutputStream out = null;
    try {
        out = new FileOutputStream(png);
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
        out.flush();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (out != null) out.close();
        }
         catch (IOException ignore) {}
        }
        final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
        emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(png));
        emailIntent.setType("image/png");
        startActivityForResult(Intent.createChooser(emailIntent, getString(R.string.send_intent_name)), REQUEST_SHARE);
    }
}

Это не будет работать, если внешнее хранилище недоступно, например, когда оно установлено как USB-накопитель. См. Руководство по API хранения для получения дополнительной информации о том, доступно ли внешнее хранилище.

Если ваш минимальный уровень API равен 8 или выше, вы можете использовать Context.getExternalCacheDir() или Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) в качестве родительского каталога.

Если вы не используете getExternalCacheDir(), убедитесь, что вы используете уникальное имя файла, чтобы случайно не перезаписать один из файлов пользователей.

Наконец, вы можете переопределить onActivityResult(), чтобы удалить файл после завершения операции share:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if(requestCode == REQUEST_SHARE) {
        if(this.png == null) {
            return;
        }

        this.png.delete();
    }
}

Ответ 3

У меня были те же симптомы. В моем случае это было потому, что я сначала сохранил вложение с разрешениями MODE_PRIVATE. Как только я изменил его на MODE_WORLD_READABLE, кажется, что Gmail тогда смог получить доступ к файлу и отправить вложение должным образом. Хотя я вижу в вашем фрагменте кода, вы использовали MODE_WORLD_READABLE... странный.

http://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE