web-dev-qa-db-fra.com

Envoi d'un courrier électronique avec pièces jointes par programme sur Android

Je souhaite implémenter un bouton qui, en appuyant dessus, ouvrira le client de messagerie par défaut avec un fichier en pièce jointe.

Je suis this , mais je reçois un message d'erreur sur startActivity, indiquant qu'il attend un paramètre d'activité alors que je lui donne une intention . J'utilise API 21 et Android Studio 1.1.0, alors cela a peut-être quelque chose à voir avec le commentaire dans la réponse fournie dans le lien?

C’est mon quatrième jour en tant que développeur Android, donc je suis désolé si je manque quelque chose de vraiment basique.

Voici mon code:

    public void sendFileToEmail(File f){

    String subject = "Lap times";
    ArrayList<Uri> attachments = new ArrayList<Uri>();
    attachments.add(Uri.fromFile(f));
    Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, attachments);
    intent.setClassName("com.Android.email", "com.Android.mail.compose.ComposeActivity");

    try {
        startActivity(intent);
    } catch (ActivityNotFoundException e) {
        e.printStackTrace();
    }
14
Digital Da

Je pense que votre problème est que vous n'utilisez pas le bon chemin de fichier.

Ce qui suit fonctionne pour moi:

Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("text/plain");
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"[email protected]"});
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "subject here");
emailIntent.putExtra(Intent.EXTRA_TEXT, "body text");
File root = Environment.getExternalStorageDirectory();
String pathToMyAttachedFile = "temp/attachement.xml";
File file = new File(root, pathToMyAttachedFile);
if (!file.exists() || !file.canRead()) {
return;
}
Uri uri = Uri.fromFile(file);
emailIntent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(emailIntent, "Pick an Email provider"));

Vous devez également donner l’autorisation de l’utilisateur via un fichier manifeste comme ci-dessous. 

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
27
King of Masses

Essayez d'utiliser this.It travaille ...

Intent emailIntent = new Intent(Android.content.Intent.ACTION_SEND); 
                    emailIntent.setType("*/*");

                    emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(listVideos.get(position).getVideoPath())));//path of video 
                    startActivity(Intent.createChooser(emailIntent, "Send mail..."));

Merci

2
Sulabh Jain

Pour les nouveaux périphériques, vous rencontrerez FileUriExposedException. Voici comment l'éviter à Kotlin.

val file = File(Environment.getExternalStorageDirectory(), "this")
val authority = context.packageName + ".provider"
val uri = FileProvider.getUriForFile(context, authority, file)
val emailIntent = createEmailIntent(uri)
startActivity(Intent.createChooser(emailIntent, "Send email..."))

private fun createEmailIntent(attachmentUri: Uri): Intent {
    val emailIntent = Intent(Intent.ACTION_SEND)
    emailIntent.type = "vnd.Android.cursor.dir/email"
    val to = arrayOf("[email protected]")
    emailIntent.putExtra(Intent.EXTRA_EMAIL, to)
    emailIntent.putExtra(Intent.EXTRA_STREAM, attachmentUri)
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "subject")
    return emailIntent
}
1
divonas