Sending an email with attachments programmatically

2019-01-18 03:44发布

I wish to implement a button that upon pressing it will open the default email client with an attachment file.

I am following this, but am getting an error message on the startActivity, saying it is expecting an activity param while I am giving it an intent. I am using API 21 and Android Studio 1.1.0, so perhaps it has something to do with the comment in the answer provided in the link?

This is my fourth day as Android developer so sorry if I am missing something really basic.

Here is my 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();
    }

3条回答
爷的心禁止访问
2楼-- · 2019-01-18 04:16

For newer devices you will encounter FileUriExposedException. Here is how to avoid it in 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("some@email.com")
    emailIntent.putExtra(Intent.EXTRA_EMAIL, to)
    emailIntent.putExtra(Intent.EXTRA_STREAM, attachmentUri)
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "subject")
    return emailIntent
}
查看更多
该账号已被封号
3楼-- · 2019-01-18 04:17

Try to use this.It is working...

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

Thanks

查看更多
聊天终结者
4楼-- · 2019-01-18 04:43

I think your problem is that you are not using the correct file path.

The following works for me:

Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("text/plain");
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"email@example.com"});
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"));

You also need to give the user permission via a manifest file like below

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
查看更多
登录 后发表回答