Android: Intent.ACTION_SEND con EXTRA_STREAM no adjunta ninguna imagen al elegir la aplicación Gmail en htc Hero

En el emulador con una aplicación de correo predeterminada todo funciona bien. Pero no tengo adjunto cuando recibo un correo que he enviado desde mi Hero utilizando una aplicación de Gmail. La aplicación de correo predeterminada en el héroe funciona bien.

¿Cómo puedo hacer que este código funcione con la aplicación de Gmail en Hero?
Puedes ver el código a continuación.

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

en Logs veo lo siguiente:

 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 

Gracias por la respuesta.

Para mí, el problema se resolvió con las siguientes líneas de código:

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

La clave es que guardo la captura de pantalla en la biblioteca multimedia y luego puedo enviar un archivo desde allí.

getFileStreamPath() o openFileOutput() crearán archivos en un directorio privado al que no pueden acceder otras aplicaciones (es decir, Gmail). Use almacenamiento externo para crear archivos accesibles públicamente:

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

Esto no funcionará cuando el almacenamiento externo no esté disponible, como cuando está montado como una unidad USB. Consulte la Guía de API de almacenamiento para obtener más información sobre cómo detectar si el almacenamiento externo está disponible.

Si su nivel mínimo de API es 8 o superior, puede usar Context.getExternalCacheDir() o Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) como el directorio principal.

A menos que termine usando getExternalCacheDir() , asegúrese de utilizar un nombre de archivo único para evitar que se sobrescriba accidentalmente uno de los archivos de los usuarios.

Finalmente, puede anular onActivityResult() para eliminar el archivo una vez que se complete la operación de compartir:

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == REQUEST_SHARE) { if(this.png == null) { return; } this.png.delete(); } } 

Tenía los mismos síntomas. En mi caso, fue porque inicialmente estaba guardando el archivo adjunto con los permisos MODE_PRIVATE . Tan pronto como lo cambié a MODE_WORLD_READABLE , parece que Gmail pudo acceder al archivo y enviar el archivo adjunto correctamente. Aunque veo en tu fragmento de código que estabas usando MODE_WORLD_READABLE … raro.

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