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.
- intento androide no activar
- Por qué la intención del servicio necesita ser una intención explícita
- Simular Android matando y reiniciar el servicio
- Error "No se puede iniciar el servicio de intención" al iniciar el servicio desde una actividad en Android
- Intención FLAG_GRANT_READ_URI_PERMISSION Uso de FileProvider en Gingerbread
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.
- ¿Cómo puedo iniciar la aplicación de correo electrónico con el campo "a" pre-llenado?
- Android ¿Intención de seguir al usuario de Twitter?
- Resolución de intenciones en Android
- ¿Cómo encontrar Intent source en Android?
- Dos botones con PendingIntents - Widget
- DialogFragment se bloquea Actividad al llamar a startActivity ()
- Enviar la imagen capturada al servidor web en android
- Reconocimiento de voz en la aplicación Android que siempre está escuchando
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