Android: Intent.ACTION_SEND с EXTRA_STREAM не прикрепляет изображения при выборе приложения Gmail в htc Hero - PullRequest
11 голосов
/ 05 февраля 2010

На эмуляторе с почтовым приложением по умолчанию все работает нормально. Но у меня нет прикрепленных файлов, когда я получаю письмо, которое я отправил от своего Героя с помощью приложения Gmail. Почтовое приложение по умолчанию на герое работает нормально.

Как сделать так, чтобы этот код работал с приложением 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

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

Ответы [ 3 ]

31 голосов
/ 17 июля 2010

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

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"));

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

7 голосов
/ 20 мая 2013

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(), чтобы удалить файл после завершения операции общего доступа:

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

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

        this.png.delete();
    }
}
2 голосов
/ 03 марта 2013

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

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

...