Tratando de adjuntar un archivo de la tarjeta SD al correo electrónico

Estoy intentando lanzar un intento de enviar un correo electrónico. Todo eso funciona, pero cuando intento enviar al correo electrónico un par de cosas "extrañas" suceden.

Aquí está el código

Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.setType("image/jpeg"); sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Photo"); sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://sdcard/dcim/Camera/filename.jpg")); sendIntent.putExtra(Intent.EXTRA_TEXT, "Enjoy the photo"); startActivity(Intent.createChooser(sendIntent, "Email:")); 

Así que si me lanzar con el contexto del menú de Gmail Muestra el archivo adjunto, me permite escribir a quién el correo electrónico es, y editar el cuerpo y el tema. No es gran cosa. Me golpeó enviar, y se envía. Lo único es que el archivo adjunto NO se envía.

Asi que. Me imaginé, ¿por qué no intentarlo con el contexto de menú de correo electrónico (para mi cuenta de correo electrónico de copia de seguridad en mi teléfono). Muestra el apego, pero ningún texto en absoluto en el cuerpo o el sujeto. Cuando lo envío, el archivo adjunto se envía correctamente. Eso me llevaría a creer que algo está muy mal. ¿Necesito un nuevo permiso en el Manifiesto para lanzar una intención de enviar correo electrónico con adjunto? ¿Qué estoy haciendo mal?

También tiene el mismo problema

Código:

 Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); emailIntent.setType("image/jpeg"); emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {"[email protected]"}); emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Test Subject"); emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "go on read the emails"); Log.v(getClass().getSimpleName(), "sPhotoUri=" + Uri.parse("file:/"+ sPhotoFileName)); emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:/"+ sPhotoFileName)); startActivity(Intent.createChooser(emailIntent, "Send mail...")); 

De adb logcat:

 V/DumbDumpersMain( 3972): sPhotoUri=file://sdcard/DumbDumpers/DumbDumper.jpg I/ActivityManager( 56): Starting activity: Intent { action=android.intent.action.CHOOSER comp={android/com.android.internal.app.ChooserActivity} (has extras) } I/ActivityManager( 56): Starting activity: Intent { action=android.intent.action.SEND type=jpeg/image flags=0x3000000 comp={com.google.android.gm/com.google.android.gm.ComposeActivityGmail} (has extras) } I/ActivityManager( 56): Starting activity: Intent { action=android.intent.action.SEND type=jpeg/image flags=0x2800000 comp={com.google.android.gm/com.google.android.gm.ComposeActivity} (has extras) } D/gmail-ls( 120): MailProvider.query: content://gmail-ls/labels/[email protected](null, null) D/Gmail ( 2507): URI FOUND:file://sdcard/DumbDumpers/DumbDumper.jpg 

Parece que el proveedor de correo electrónico está adjuntando un archivo de longitud 0. Cuando compruebo el sistema de archivos el archivo está allí y correcto. El código que crea el archivo de imagen está bien terminado antes de intentar enviarlo por correo electrónico.

Alguien arregló esto sin reinicios mágicos (ya lo he intentado)?

Saludos,
Aleta

Actualizar

El camino para mí debería haber sido

file:///sdcard/DumbDumpers/DumbDumper.jpg

Usted necesita el extra / como esto señala al directorio de la raíz, es decir:

file:// + /sdcard/DumbDumpers/DumbDumper.jpg

Combinado como

file:///sdcard/DumbDumpers/DumbDumper.jpg

En el fragmento anterior necesita:

 emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+ sPhotoFileName)); 

Espero que esto ayude. Me tomó años depurar.

Saludos,
Finlay

Sólo una pequeña observación de mi lado. He estado teniendo los mismos problemas con GMail, pero de alguna manera parece funcionar cuando almaceno el archivo en cuestión en la tarjeta SD primero y recuperar de allí, en lugar de los activos. Así que mi código es el siguiente:

 Intent i = new Intent(Intent.ACTION_SEND); i.putExtra(Intent.EXTRA_SUBJECT, "Title"); i.putExtra(Intent.EXTRA_TEXT, "Content"); i.putExtra(Intent.EXTRA_STREAM, uri); i.setType("text/plain"); startActivity(Intent.createChooser(i, "Send mail")); 

y aquí,

 uri = Uri.fromFile(new File(context.getFilesDir(), FILENAME)); 

No funciona, mientras que

 uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), FILENAME)); 

hace.

Saludos, Michael

En lugar de "Uri.parse" utilice "Uri.fromFile (nuevo archivo (Environment.getExternalStorageDirectory ()," nombre de archivo "))"

Environment.getExternalStorageDirectory () – ruta a SDcard o cualquier otro almacenamiento externo

Parece que esto es realmente correcto, no estoy seguro de lo que estaba sucediendo, pero después de un reinicio que comenzó a trabajar: /

  Intent i = new Intent(Intent.ACTION_SEND); i.setType("message/rfc822"); i.putExtra(Intent.EXTRA_EMAIL , new String[]{"[email protected]"}); i.putExtra(Intent.EXTRA_SUBJECT, "Data from app"); i.putExtra(Intent.EXTRA_TEXT , "experience number x"); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "filename.txt")); i.putExtra(Intent.EXTRA_STREAM, uri); startActivity(Intent.createChooser(i, "Send email...")); 

Tengo el mismo problema y busqué por todas partes una solución. Finalmente lo resolví encontrando una aplicación de código abierto que funcionó fuera de la caja y miró cómo lo hicieron. El código es bastante largo, así que no lo citaré aquí, sino postear un enlace. Mira la función sendEmail en la línea 449

http://rehearsalassist.svn.sourceforge.net/viewvc/rehearsalassist/android/trunk/src/urbanstew/RehearsalAssistant/SessionPlayback.java?revision=94&view=markup

Refactoreé mi código para ser similar, y ahora funciona. Espero que esto ayude a otros en la misma situación.

Del RFC 1738 sección 3.10:

Una URL de archivo toma la forma:

  file://<host>/<path> 

Donde host es el nombre de dominio completo del sistema en el que se puede acceder a la ruta de acceso y path es una ruta de directorio jerárquica del directorio / directory /…/ nombre del formulario.

Así que es file: /// path / from / root como http: // host / path / from / root porque hay un 'localhost' implícito entre la segunda y tercera barra. Pero como se mencionó anteriormente, use Uri.FromFile () para construirlo.

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 fue capaz de acceder al archivo y enviar el archivo adjunto correctamente.

Ver más

Es un trabajo perfecto para mí: En esta solución el Nicolas crear una copia dentro de la carpeta de caché y aquí Gmail intención tiene acceso! http://stephendnicholas.com/archives/974

 public void sendMail(String path) { Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {AppConstant.server_mail}); emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "IBPS ERROR Mail"); emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "This is an autogenerated mail from IBPS app"); emailIntent.setType("image/png"); Uri myUri = Uri.parse("file://" + path); emailIntent.putExtra(Intent.EXTRA_STREAM, myUri); startActivity(Intent.createChooser(emailIntent, "Send mail...")); } 

También intenta agregar Intent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION); Esto ayudó con mi problema.

Tengo la solución en esto después de 4 días, observa por favor los puntos siguientes mientras que da la trayectoria a la clase del archivo en androide (Java):

1) Utilice la ruta de acceso para el almacenamiento interno String path = "/ storage / sdcard0 / myfile.txt";

2) path = "/ storage / sdcard1 / myfile.txt";

3) mencionar permisos en el archivo Manifest.

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

4) Primero compruebe la longitud del archivo para confirmarlo.

5) Compruebe las trayectorias en ES File Explorer con respecto a sdcard0 & sdcard1 es esto mismo o bien ……

p.ej

 File file=new File(path); long=file.length();//in Bytes 

Enviar un correo electrónico con un archivo adjunto: (Por doc.)

Intención emailIntent = new Intent (Intent.ACTION_SEND); EmailIntent.setType (HTTP.PLAIN_TEXT_TYPE);

EmailIntent.putExtra (Intent.EXTRA_EMAIL, nueva cadena [] {"[email protected]"});

EmailIntent.putExtra (Intent.EXTRA_SUBJECT, "Asunto de correo electrónico"); EmailIntent.putExtra (Intent.EXTRA_TEXT, "Texto del mensaje de correo electrónico"); EmailIntent.putExtra (Intent.EXTRA_STREAM, Uri.parse ("content: // path / to / email / attachment"));

// También puede adjuntar varios elementos pasando un ArrayList de Uris

  • Instalación de APK desde un archivo adjunto de correo electrónico
  • Aplicación de Android para enviar correo electrónico con datos adjuntos mediante la API de Java Mail
  • Cómo enviar una URL en un correo electrónico mediante Android Intents
  • ¿Cómo puedo utilizar authToken para enviar correo electrónico?
  • Envío de imágenes HTML en línea en el correo electrónico
  • Las tablas de ancho de 100% no funcionan en Gmail Android
  • Enviando intentos de correo electrónico HTML sin tener <img> eliminado?
  • Android ACTION_SEND Hipervínculo no funciona en GMail
  • Eliminar archivo después de compartir a través de la intención
  • Habilitar teclado de correo electrónico en android para el tipo de entrada de correo electrónico
  • El envío de correo electrónico html en android con <table>, etc - no hay realmente una forma de intención relativamente integrada?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.