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

En el Emulador con una aplicación de correo predeterminada todo funciona bien. Pero no tengo ningún adjunto cuando estoy recibiendo un correo que he enviado de mi héroe usando una aplicación de Gmail. La aplicación de correo predeterminada en el héroe funciona correctamente.

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

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 Registros 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 estoy guardando la captura de pantalla en la biblioteca de medios y luego puede enviar con éxito un archivo desde allí.

getFileStreamPath() o openFileOutput() creará archivos en un directorio privado inaccesible a otras aplicaciones (por ejemplo, Gmail). Utilice el almacenamiento externo para crear archivos públicamente accesibles:

 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 se monta como una unidad USB. Consulte la Guía de la API de almacenamiento para obtener más información sobre la detección de almacenamiento externo disponible.

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

A menos que getExternalCacheDir() utilizando getExternalCacheDir() , asegúrate de usar un nombre de archivo único para evitar que uno de los archivos de los usuarios se sobreescriba accidentalmente.

Finalmente, puede anular onActivityResult() para eliminar el archivo después de completar la operación de compartimiento:

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

Tuve 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 el fragmento de código que estaba usando MODE_WORLD_READABLE … extraño.

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

  • ¿Cómo puede HierarchyViewer herramienta de estudio de Android conocer las propiedades de las vistas de la pantalla de Android
  • Android - Cómo lanzar la intención del mapa de Google en la aplicación android con cierta ubicación, nivel de zoom y marcador
  • NullPointerException android.support.v4.app.FragmentManagerImpl.saveFragmentBasicState
  • Android getIntent () devuelve la primera intención
  • Principiante: usando variables definidas en una clase en otra clase
  • Android Adjuntar un archivo a GMAIL - No se puede adjuntar archivo vacío
  • Android - Cómo comprobar si textview es nulo o no nulo
  • Crear un "Tweet este botón" para compartir información sólo en Twitter no es tan fácil
  • Abrir google maps a través de la intención de ubicación específica en android
  • Maneje la rotación de la pantalla sin perder datos - Android
  • Android: navegar hasta la actividad principal recrea la actividad principal
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.