android - raiz - Intentando adjuntar un archivo de la tarjeta SD a un correo electrónico
ficheros en android memoria externa (13)
De RFC 1738 sección 3.10:
Una URL de archivo toma la forma:
file://<host>/<path>
donde host es el nombre de dominio completamente calificado del sistema en el que se puede acceder a la ruta, y path es una ruta de directorio jerárquica del directorio de formulario / directorio / ... / nombre .
Así que es file: /// path / from / root al igual que http://host/path/from/root porque hay un ''localhost'' implícito entre la segunda y la tercera barra inclinada. Pero como se mencionó anteriormente, use Uri.FromFile () para compilarlo.
Estoy intentando lanzar una intención para enviar un correo electrónico. Todo eso funciona, pero cuando trato de enviar el correo electrónico, suceden cosas ''extrañas''.
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:"));
Por lo tanto, si inicio utilizando el contexto del menú de Gmail, muestra el archivo adjunto, me permite escribir a quién va dirigido el correo electrónico y edito el cuerpo y el asunto. No es gran cosa. Pulso enviar, y envía. Lo único es que el archivo adjunto NO se envía.
Asi que. Pensé, ¿por qué no intentarlo con el contexto del menú de correo electrónico (para mi cuenta de correo electrónico de respaldo en mi teléfono). Muestra el archivo adjunto, pero no texto en el cuerpo o tema. Cuando lo envío, el archivo adjunto se envía correctamente. Eso me llevaría a creer que algo está bastante mal. ¿Necesito un nuevo permiso en el lanzamiento del Manifiesto para enviar un correo electrónico con un archivo adjunto? ¿Qué estoy haciendo mal?
Enviar un correo electrónico con un archivo adjunto: (Por documentos)
Intent emailIntent = new Intent (Intent.ACTION_SEND); emailIntent.setType (HTTP.PLAIN_TEXT_TYPE);
emailIntent.putExtra (Intent.EXTRA_EMAIL, new String [] {"[email protected]"});
emailIntent.putExtra (Intent.EXTRA_SUBJECT, "Asunto del correo electrónico"); emailIntent.putExtra (Intent.EXTRA_TEXT, "Texto del mensaje de correo electrónico"); emailIntent.putExtra (Intent.EXTRA_STREAM, Uri.parse ("contenido: // ruta / a / correo electrónico / archivo adjunto"));
// También puede adjuntar varios elementos al pasar una lista de Array de Uris
Me funciona a la perfección: con esta solución, Nicolas crea una copia dentro de la carpeta Caché y aquí ¡el intento de Gmail tiene acceso! http://stephendnicholas.com/archives/974
Parece que esto es realmente correcto, no estoy seguro de lo que estaba sucediendo, pero después de un reinicio comenzó a funcionar: /
Solo un pequeño comentario de mi parte. He tenido los mismos problemas con GMail, pero de alguna manera parece funcionar cuando almaceno el archivo en cuestión en la tarjeta SD primero y lo recupero desde allí, en lugar de hacerlo desde los activos. Entonces 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
También intente agregar Intent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION); Esto ayudó con mi problema.
También obteniendo 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..."));
Desde 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 0 longitud. Cuando reviso el sistema de archivos, el archivo está allí y es correcto. El código que crea el archivo de imagen está bien terminado antes del intento de enviarlo por correo electrónico.
Alguien solucionó esto sin reiniciar la magia (ya lo intenté).
Saludos,
Aleta
Actualizar
La ruta para mí debería haber sido
file:///sdcard/DumbDumpers/DumbDumper.jpg
necesita el extra /
como esto apunta al directorio raíz, es decir:
file://
+ /sdcard/DumbDumpers/DumbDumper.jpg
combinado como
file:///sdcard/DumbDumpers/DumbDumper.jpg
En el fragmento de arriba necesitas:
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+ sPhotoFileName));
Espero que esto ayude. Me llevó años depurar.
Saludos,
Finlay
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.
Tengo el mismo problema y busqué una solución en todas partes. Finalmente lo resolví encontrando una aplicación de código abierto que funcionó de la caja y vi cómo lo hicieron. El código es bastante largo, así que no lo citaré aquí, sino que publicaré un enlace. Mire la función sendEmail en la línea 449
Refactoré mi código para que sea similar, y ahora funciona. Espero que esto ayude a otros en la misma situación.
Tengo una solución para esto después de 4 días, tenga en cuenta los siguientes puntos al dar paso a la clase de archivo en Android (Java):
1) Use la ruta para el almacenamiento interno String path = "/ storage / sdcard0 / myfile.txt";
2) path = "/ storage / sdcard1 / myfile.txt";
3) mencionar permisos en el archivo Manifiesto.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
4) Primero revise la longitud del archivo para confirmarlo.
5) Compruebe las rutas en ES File Explorer con respecto a sdcard0 y sdcard1 es esto mismo o sino ......
p.ej
File file=new File(path);
long=file.length();//in Bytes
en lugar de "Uri.parse" use "Uri.fromFile (new File (Environment.getExternalStorageDirectory ()," file name "))"
Environment.getExternalStorageDirectory () - ruta a la tarjeta SD o cualquier otro almacenamiento externo
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..."));
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..."));
}