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?
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
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
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
Il semble que cela soit réellement correct, sans savoir ce qui se passait, mais après un redémarrage, cela a commencé à fonctionner:
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..."));
De RFC 1738 section 3.10:
Une URL de fichier prend la forme:
file://<Host>/<path>
où 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.
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
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.
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
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.
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..."));
}
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
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
Essayez également d'ajouter Intent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION); Cela a aidé avec mon problème.