Android – impossible de joindre un fichier au courrier électronique

Par défaut, les fichiers enregistrés dans la mémoire interne sont privés de votre application et d'autres applications ne peuvent y accéder (ni l'utilisateur).

Je peux voir le fichier "/ data / data / package_name / files / in explorer dans DDMS, mais quand j'ai attaché l'URI du fichier ci-dessus à l'aide d'imageUri dans le courrier électronique, j'ai vu que le fichier joint est de 0kb. J'ai utilisé le fichier" / data / data / package_name / API par courrier électronique par défaut d'Android.

  • L'appel terminé () d'une activité libère-t-il mon espace mémoire?
  • Obtenir le nom / l'étiquette de l'application via ADB Shell ou Terminal
  • Lecture d'un fichier texte à l'aide de InputStream
  • La différence entre la surcharge et l'interception doit-elle être définie?
  • Comment faire pour activer / désactiver le service d'accessibilité par programme dans Android
  • Xamarin fichier de ressources Android introuvable
  • Quelqu'un peut-il me suggérer comment attacher un fichier dans un courriel qui est privé de la demande?

    Bien que j'ai réussi à enregistrer le fichier dans la carte SD et à joindre le fichier de la carte SD, cela fonctionne bien.

    Mais si la carte SD n'est pas disponible et sauvegarde le fichier sur le stockage interne, alors, comment puis-je les joindre au courrier électronique.

    String FILENAME = "hello_file.txt"; String string = "hello world!";FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); fos.write(string.getBytes()); fos.close(); File imageFile = getFileStreamPath(FILENAME ); Uri imageUri = Uri.fromFile(imageFile); final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); emailIntent.setType("*/*"); emailIntent.putExtra(android.content.Intent.EXTRA_STREAM,imageUri); this.startActivityForResult(Intent.createChooser(emailIntent, "Send mail..."),SUB_ACTIVITY); 

  • Est-il possible de lancer un DialogFragment à partir d'une Préférence dans une PréférenceActivité?
  • Raccourci pour basculer entre le design et le texte dans le studio Android
  • Comment puis-je effectivement mettre en œuvre le modèle de conception MVVM pour mon application Android qui facilitera également l'écriture des cas de test?
  • Impossible d'ouvrir le magasin de clés dans AndroidStudio - "Octets de longueur redondante trouvés"
  • Virtual Machine Acceleration pour Android Emulator
  • Comment utiliser SQLite DB depuis AsyncTask?
  • 7 Solutions collect form web for “Android – impossible de joindre un fichier au courrier électronique”

    Lorsque vous essayez d'attacher un fichier à partir d'une mémoire interne, GMail écrit une erreur sur le journal:

     ERROR/Gmail(...): file:// attachment paths must point to file:///mnt/sdcard. 

    L'application par courrier électronique vous montrera le fichier joint, même s'il n'existait pas physiquement.

    En ce qui concerne un stockage externe, la documentation indique que:

    Chaque appareil compatible avec Android prend en charge un "stockage externe" partagé que vous pouvez utiliser pour enregistrer des fichiers. Cela peut être un support de stockage amovible (comme une carte SD) ou un stockage interne (non amovible).

    Cela signifie que vous ne devez pas vous soucier de l'absence de stockage externe d'un périphérique. Pourtant, le stockage externe peut être indisponible par moments. Reportez-vous à http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

     Android: Attaching files from internal cache to Gmail package com.stephendnicholas.gmailattach; 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 CLASS_NAME = "CachedFileProvider"; // The authority is the symbolic name for the provider class public static final String AUTHORITY = "com.stephendnicholas.gmailattach.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 { String LOG_TAG = CLASS_NAME + " - openFile"; Log.v(LOG_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 // Eg // 'content://com.stephendnicholas.gmailattach.provider/Test.txt' // Take this and build the path to the file 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(LOG_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; } } <provider android:name="CachedFileProvider" android:authorities="com.stephendnicholas public static void createCachedFile(Context context, String fileName, String content) throws IOException { File cacheFile = new File(context.getCacheDir() + File.separator + fileName); cacheFile.createNewFile(); FileOutputStream fos = new FileOutputStream(cacheFile); OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF8"); PrintWriter pw = new PrintWriter(osw); pw.println(content); pw.flush(); pw.close(); } public static Intent getSendEmailIntent(Context context, String email, String subject, String body, String fileName) { final Intent emailIntent = new Intent( android.content.Intent.ACTION_SEND); //Explicitly only use Gmail to send emailIntent.setClassName("com.google.android.gm","com.google.android.gm.ComposeActivityGmail"); emailIntent.setType("plain/text"); //Add the recipients emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { email }); emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject); emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, body); //Add the attachment by specifying a reference to our custom ContentProvider //and the specific file of interest emailIntent.putExtra( Intent.EXTRA_STREAM, Uri.parse("content://" + CachedFileProvider.AUTHORITY + "/" + fileName)); return emailIntent; } enter code here 

    Pour partager un fichier privé, vous devez utiliser ContentProvider pour fournir un accès à votre fichier par d'autres applications. Voici un excellent exemple: Android: joindre des fichiers du cache interne à Gmail .

    En outre, bien que le tutoriel mentionne que vous devez déclarer votre fournisseur dans le fichier de manifestation Android, il ne spécifie pas qu'il devrait être contenu dans <application> , assurez-vous que lorsque vous déclarez qu'il est dans <application> </application> .

    Ce code peut vous aider à faire une idée de la pièce jointe:

     @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); buttonSend = (Button) findViewById(R.id.buttonSend); textTo = (EditText) findViewById(R.id.editTextTo); textSubject = (EditText) findViewById(R.id.editTextSubject); textMessage = (EditText) findViewById(R.id.editTextMessage); buttonSend.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { String to = textTo.getText().toString(); String subject = textSubject.getText().toString(); String message = textMessage.getText().toString(); Intent i = new Intent(Intent.ACTION_SEND); i.setType("plain/text"); File data = null; try { Date dateVal = new Date(); String filename = dateVal.toString(); data = File.createTempFile("Report", ".csv"); FileWriter out = (FileWriter) GenerateCsv.generateCsvFile( data, "Name,Data1"); i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(data)); i.putExtra(Intent.EXTRA_EMAIL, new String[] { to }); i.putExtra(Intent.EXTRA_SUBJECT, subject); i.putExtra(Intent.EXTRA_TEXT, message); startActivity(Intent.createChooser(i, "E-mail")); } catch (IOException e) { e.printStackTrace(); } } }); } public class GenerateCsv { public static FileWriter generateCsvFile(File sFileName,String fileContent) { FileWriter writer = null; try { writer = new FileWriter(sFileName); writer.append(fileContent); writer.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } return writer; } } 

    Le code ci-dessus vous oblige à ajouter l'autorisation suivante à votre fichier manifeste:

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

    Essayez d'utiliser Context.MODE_WORLD_READABLE au lieu de Context.MODE_PRIVATE lors de la sauvegarde du fichier. Ensuite, d'autres applications auront accès au fichier.

    J'ai également connu ce problème à l'aide de fichiers internes et bien que j'ai utilisé openFileInput avec MODE_WORLD_READABLE sur /data/data//files/testFileName.txt et utilisé l'URI.parse avec le extra "/" (voir ci-dessous), le test reçu envoyé par courrier électronique Manque encore de la pièce jointe souhaitée. Désolé, mais il n'y a pas de réponse, sauf essayer d'utiliser des fichiers externes sur la carte SD – quelle est ma prochaine expérience!

    Code:

     File tmpFile = new File(context.getFilesDir(), mfileName); Log.d(TAG, tmpFile.toString()); // This shows: /data/data/org.eddiem.adeveloper.flatfiletest/files/testFile.csv //File tmpFile2 = new File(context.getFileStreamPath(mfileName), mfileName); //Log.v(TAG, tmpFile2.toString()); // This also shows: /data/data/org.eddiem.adeveloper.flatfiletest/files/testFile.csv //Uri uri = Uri.fromFile(new File(context.getFileStreamPath(mfileName), mfileName)); Uri uri = Uri.parse("file://" + tmpFile.toString()); //Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), // mfileName)); Log.d(TAG, "Uri-path is: " + uri.getPath()); // or .toString() Intent i = new Intent(android.content.Intent.ACTION_SEND); i.setType("text/plain"); i.putExtra(Intent.EXTRA_EMAIL, new String[]{"eddie.moxey@sky.com"}); i.putExtra(Intent.EXTRA_SUBJECT, "Test Email - with Attachment"); i.putExtra(Intent.EXTRA_TEXT, "This is a test Email with an Attachment."); i.putExtra(Intent.EXTRA_STREAM, uri); //startActivity(Intent.createChooser(i, "Select application")); startActivity(Intent.createChooser(i, "Send mail")); 

    J'étais confronté au même problème et le suivi m'a fonctionné.

    D'abord, envoyez Broadcast pour notifier le fichier sur lequel ce fichier est créé / monté.

    Par exemple:

     sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://"+storagePath))); 

    Ensuite, utilisez le code pour envoyer un courrier avec pièce jointe.

     Intent email = new Intent(Intent.ACTION_SEND); email.putExtra(Intent.EXTRA_EMAIL, "Receiver Email Address" ); email.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); email.putExtra(Intent.EXTRA_SUBJECT, "Subject"); email.putExtra(Intent.EXTRA_TEXT,"Email Text"); //Mime type of the attachment (or) u can use sendIntent.setType("*/*") //email.setType("text/plain"); email.setType("application/YourMimeType"); //Full Path to the attachment email.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+storagePath)); try { startActivity(Intent.createChooser(email, "Send Message...")); } catch (android.content.ActivityNotFoundException ex) { } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.