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 

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

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

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

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

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

 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