Cómo adjuntar archivo al correo electrónico de / carpeta de datos del dispositivo

Estoy tratando de adjuntar el archivo desde la carpeta / data del dispositivo.

He creado con éxito "abc.txt" en / carpeta de datos, puedo ver el archivo en ese lugar.

Estoy usando código abajo para enviar correo electrónico:

Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_EMAIL, new String[]{[email protected]}); intent.putExtra(Intent.EXTRA_STREAM, Uri.parse(Environment.getDataDirectory()+"/abc.txt")); intent.putExtra(Intent.EXTRA_TEXT, "hello.."); startActivity(Intent.createChooser(intent, email_chooser_title)); 

Pero no puedo recibir los archivos adjuntos ..

Pl. Déjame saber cuál es el error que he hecho

Gracias.

Debe copiar el archivo en el directorio externo (también conocido como Tarjeta SD). Es porque la aplicación de correo electrónico no puede acceder a su directorio de datos (de la misma manera que no puede acceder al directorio de datos de otra aplicación)

Trate de usar este código:

 File sdCard = Environment.getExternalStorageDirectory(); PATH=sdCard.toString()+"/abc.txt"; Intent intent=new Intent(Intent.ACTION_SEND); intent.setType("**/**");// or intent.setType("text/plain"); String[] recipients={"[email protected]"); intent.putExtra(Intent.EXTRA_EMAIL, recipients); intent.putExtra(Intent.EXTRA_SUBJECT,getResources().getString(R.string.app_name)); intent.putExtra(Intent.EXTRA_STREAM,Uri.parse("file://"+PATH)); intent.putExtra(Intent.EXTRA_TEXT, "hello.."); startActivity(Intent.createChooser(intent,"")); 

Asegúrese de que haya un archivo abc.txt en la tarjeta SD de su dispositivo / emulador.

También incluya estos dos permisos en el archivo de manifiesto de su proyecto:

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

Desde Android: adjuntar archivos desde caché interno a Gmail (con algunas modificaciones que le permiten ejecutar este código en Lollipop).

Básicamente debe implementar su propia clase que extienda ContentProvider (diga CachedFileProvider, vea más abajo), y agregue un campo siguiente en el manifiesto (dentro de la etiqueta / application):

 <provider android:name=".CachedFileProvider" android:authorities="com.your.app.provider" android:grantUriPermissions="true" /> 

Al abrir un selector de correo, use el siguiente código:

 File f = getLocalFileToSend(); Uri uri = Uri.parse("content://" + CachedFileProvider.AUTHORITY + "/" + f.getName()); Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); intent.putExtra(Intent.EXTRA_TEXT, "Body"); intent.putExtra(Intent.EXTRA_STREAM, uri); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Grant permissions to read. startActivity(Intent.createChooser(intent, "Send Email")); 

El código para CachedFileProvider:

 package ...; import java.io.File; import java.io.FileNotFoundException; import android.content.ContentProvider; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.net.Uri; import android.os.ParcelFileDescriptor; import android.util.Log; public class CachedFileProvider extends ContentProvider { private static final String TAG = "CachedFileProvider"; private static final String CLASS_NAME = "CachedFileProvider"; // The authority is the symbolic name for the provider class. // Should match one in the manifest file. public static final String AUTHORITY = "com.your.app.provider"; // UriMatcher used to match against incoming requests private UriMatcher uriMatcher; @Override public boolean onCreate() { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); // Add a URI to the matcher which will match against the form // 'content://com.stephendnicholas.gmailattach.provider/*' // and return 1 in the case that the incoming Uri matches this pattern uriMatcher.addURI(AUTHORITY, "*", 1); return true; } @Override public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { Log.v(TAG, "Called with uri: '" + uri + "'." + uri.getLastPathSegment()); // Check incoming Uri against the matcher switch (uriMatcher.match(uri)) { // If it returns 1 - then it matches the Uri defined in onCreate case 1: // The desired file name is specified by the last segment of the path. String fileLocation = getContext().getCacheDir() + File.separator + uri.getLastPathSegment(); // Create & return a ParcelFileDescriptor pointing to the file // Note: I don't care what mode they ask for - they're only getting // read only ParcelFileDescriptor pfd = ParcelFileDescriptor.open(new File( fileLocation), ParcelFileDescriptor.MODE_READ_ONLY); return pfd; // Otherwise unrecognised Uri default: Log.v(TAG, "Unsupported uri: '" + uri + "'."); throw new FileNotFoundException("Unsupported uri: " + uri.toString()); } } // ////////////////////////////////////////////////////////////// // Not supported / used / required for this example // ////////////////////////////////////////////////////////////// @Override public int update(Uri uri, ContentValues contentvalues, String s, String[] as) { return 0; } @Override public int delete(Uri uri, String s, String[] as) { return 0; } @Override public Uri insert(Uri uri, ContentValues contentvalues) { return null; } @Override public String getType(Uri uri) { return null; } @Override public Cursor query(Uri uri, String[] projection, String s, String[] as1, String s1) { return null; } } 

Prueba esto en lugar de la cuarta línea

 intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:/data/abc.txt")); 

Si está en sdcard:

 intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:/sdcard/data/abc.txt")); 

En lugar de utilizar Environment.getDataDirectory()+"/abc.txt" ¿ha intentado usar Environment.getExternalStorageDirectory()+"/abc.txt" ?

Siento que este cambio debe hacer el truco. Por supuesto, para que esto funcione, usted tiene que tener el archivo en la tarjeta SD del teléfono / emulador.

 Try this code!!!! File sdCard = Environment.getExternalStorageDirectory(); PATH=sdCard.toString(); String path =PATH.replace("/mnt","") + "/abc.txt"; Intent intent=new Intent(Intent.ACTION_SEND); intent.setType("**/**");// or intent.setType("text/plain"); String[] recipients={"[email protected]"); intent.putExtra(Intent.EXTRA_EMAIL, recipients); intent.putExtra(Intent.EXTRA_SUBJECT,getResources().getString(R.string.app_name)); intent.putExtra(Intent.EXTRA_STREAM,Uri.parse("file://" +path)); intent.putExtra(Intent.EXTRA_TEXT, "hello.."); startActivity(Intent.createChooser(intent,"")); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.