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

StackOverflow https://stackoverflow.com/questions/2206397

Вопрос

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

Как я могу заставить этот код работать с приложением 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

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

Это было полезно?

Решение

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

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

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

Другие советы

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();
    }
}

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top