web-dev-qa-db-fra.com

Essayer de joindre un fichier de la carte SD à un courrier électronique

J'essaie de lancer une intention d'envoyer un email. Tout cela fonctionne, mais lorsque j'essaie d'envoyer le courrier électronique, il se passe des choses "étranges".

voici le code 

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:"));

Donc, si je lance en utilisant le contexte du menu Gmail Il montre la pièce jointe, me permet de taper à qui l'e-mail est destiné et d'éditer le corps et le sujet. Pas grave. Je frappe envoi, et ça envoie. La seule chose est que la pièce jointe ne soit PAS envoyée.

Alors. J'ai pensé, pourquoi ne pas l'essayer avec le contexte du menu Email (pour mon compte de messagerie de secours sur mon téléphone). Il montre la pièce jointe, mais pas de texte dans le corps ou le sujet. Lorsque je l'envoie, la pièce jointe est envoyée correctement. Cela me ferait croire que quelque chose ne va pas. Ai-je besoin d'une nouvelle autorisation dans le lancement du manifeste pour envoyer un e-mail avec pièce jointe? Qu'est-ce que je fais mal?

69
Chrispix

Obtenir également le même problème

Code:

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

On dirait que le fournisseur de messagerie joint un fichier de longueur 0. Lorsque je vérifie le système de fichiers, le fichier est présent et correct. Le code qui crée le fichier image est bien fini avant de tenter de l'envoyer par courrier électronique. 

Quelqu'un a résolu ce problème sans redémarrage magique (j'ai déjà essayé cela)?

Cordialement,
Ailette

Mettre à jour

Chemin pour moi aurait dû être

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

vous avez besoin du / supplémentaire car il pointe vers le répertoire racine, c'est-à-dire:

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

combiné comme

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

Dans l'extrait ci-dessus, vous avez besoin de:

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

J'espère que ça aide. Il m'a fallu des siècles pour déboguer.

Cordialement,
Finlay

95
Finlay

Juste une petite remarque de ma part. Je rencontre les mêmes problèmes avec GMail, mais cela semble fonctionner lorsque je stocke d'abord le fichier en question sur la carte SD et que je le récupère à partir de celui-ci, plutôt que des ressources. Donc, mon code est le suivant:

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"));

et ici,

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

fait pas travaille, alors que

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

est-ce que.

Cordialement, .__ Michael

21
Michael F

au lieu de "Uri.parse", utilisez "Uri.fromFile (nouveau fichier (Environment.getExternalStorageDirectory ()," nom de fichier "))"

Environment.getExternalStorageDirectory () - chemin de la carte SD ou de tout autre stockage externe

7
Snigdha

Il semble que cela soit réellement correct, sans savoir ce qui se passait, mais après un redémarrage, cela a commencé à fonctionner:

4
Chrispix
    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..."));
4
Eduardo Matos

De RFC 1738 section 3.10:

Une URL de fichier prend la forme:

   file://<Host>/<path>

Host est le nom de domaine complet du système sous dont le chemin est accessible, et chemin est une hiérarchie chemin de répertoire de la forme répertoire/répertoire /.../ nom.

Il s’agit donc de fichier: /// chemin/depuis/racine comme http: // hôte/chemin/depuis/racine car il existe un «hôte local» implicite entre les deuxième et troisième barres obliques. Mais comme mentionné ci-dessus, utilisez Uri.FromFile () pour le construire.

3
android.weasel

J'ai eu le même problème et j'ai cherché partout une solution. Finalement, j'ai résolu le problème en trouvant une application open source qui fonctionnait parfaitement et en regardant comment ils l'avaient fait. Le code est assez long donc je ne le citerai pas ici, mais posterai un lien. Regardez la fonction sendEmail à la ligne 449

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

Je refactored mon code pour être similaire, et maintenant cela fonctionne. J'espère que cela aidera d'autres personnes dans la même situation.

3
Railsdev

J'ai la solution à ce sujet après 4 jours. Veuillez noter les points suivants lors du chemin d'accès à la classe File dans Android (Java):

1) Utiliser le chemin pour le stockage interne String path = "/ storage/sdcard0/myfile.txt"; 

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

3) mentionner les autorisations dans le fichier manifeste.

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

4) Vérifiez d'abord la longueur du fichier pour confirmation. 

5) Vérifier les chemins dans ES File Explorer concernant sdcard0 & sdcard1 est la même chose sinon ......

par exemple.

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

J'ai eu les mêmes symptômes. Dans mon cas, c’était parce que j’étais en train d’enregistrer la pièce jointe avec les permissions MODE_PRIVATE. Dès que je l'ai changé en MODE_WORLD_READABLE, il semble que GMail ait ensuite pu accéder au fichier et envoyer la pièce jointe correctement. 

Voir plus

0
CasualCoder
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..."));
        }
0
Jotiram Chavan

Envoyer un email avec une pièce jointe: (Par docs)

Intention 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, "Objet de l'e-mail"); emailIntent.putExtra (Intent.EXTRA_TEXT, "Texte du message électronique"); emailIntent.putExtra (Intent.EXTRA_STREAM, Uri.parse ("content: // chemin/vers/email/pièce jointe")); 

// Vous pouvez également attacher plusieurs éléments en passant une liste ArrayList of Uris

0
shaiban

Cela fonctionne parfaitement pour moi: Sur cette solution, Nicolas crée une copie dans le dossier Cache et l’intention de gmail y a accès! http://stephendnicholas.com/archives/974

0
lucasddaniel

Essayez également d'ajouter Intent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION); Cela a aidé avec mon problème. 

0
James Jones