2011-06-30 11 views
5

Estoy tratando de adjuntar el archivo desde la carpeta/data del dispositivo.cómo adjuntar archivo al correo electrónico desde la carpeta/data del dispositivo

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

estoy usando código de 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 soy capaz de recibir los archivos adjuntos ..

pl. déjame saber cuál es el error que he hecho ..

gracias.

+0

Usted no obtener algún error? Simplemente envía, usted recibe el correo electrónico, ¿pero ningún archivo adjunto? –

+0

No recibo ningún error. Simplemente envía sin ningún archivo adjunto. – brig

Respuesta

2

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

+0

Sí, probablemente funcionaría si el teléfono entra en modo raíz. –

+0

Sí, si está en modo raíz, puede leer archivos desde/data/folder ...de lo contrario, debe usar/sdcard – Cristian

+0

Esto no es técnicamente cierto; puede poner un archivo * legible en todo el mundo * en la carpeta * de su aplicación/datos o donde ese dispositivo Android particular proporciona aplicaciones con almacenamiento interno y una aplicación de correo electrónico _debería poder leerlo, aunque ha habido versiones de la aplicación gmail que rechazaron para hacerlo (aunque el sistema operativo les permitiría) a menos que se indique allí con algún /../../ truco de ruta de tipo. –

0

Prueba este lugar de la cuarta línea de

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

Si es en sdcard:

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

Tenga en cuenta que el primero no funcionará, porque la aplicación en cuestión no tiene permiso para escribir nada _directly_ en/data, pero solo en la subcarpeta asignada en/data. La capacidad de lectura de otra aplicación se basaría en el permiso establecido por quien creó el archivo, aunque _ability_ y _willingness_ para leer no son exactamente lo mismo en el caso de la aplicación de gmail. –

0

En lugar de utilizar Environment.getDataDirectory()+"/abc.txt" ¿trató usando Environment.getExternalStorageDirectory()+"/abc.txt"?

Creo que este cambio debería ser el truco. Por supuesto, para que esto funcione, debe tener el archivo en la tarjeta SD del teléfono/emulador.

1

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 hay un fichero abc.txt en su dispositivo/sdcard del emulador.

incluyen también 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"/> 
+0

¿está funcionando? – AkashG

0
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,"")); 
1

De Android: Attaching files from internal cache to Gmail (con algunas modificaciones que le permite ejecutar este código en Lollipop).

Básicamente lo que necesita para implementar su propia clase que se extiende ContentProvider (digamos CachedFileProvider, véase más adelante), y añadir un campo siguiente en el manifiesto (en el interior de la etiqueta/aplicación):

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

Al abrir un selector electrónico, utilizar código siguiente:

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; 
    } 
} 
Cuestiones relacionadas