在 Android 上以编程方式发送带附件的电子邮件

Sending an email with attachments programmatically on Android

我希望实现一个按钮,按下它会打开带有附件文件的默认电子邮件客户端。

我正在关注 this,但我在 startActivity 上收到一条错误消息,说它在我给它一个意图时需要一个 activity 参数。 我正在使用 API 21 和 Android Studio 1.1.0,所以这可能与 link?

中提供的答案中的评论有关

这是我作为 Android 开发人员的第四天,如果我遗漏了一些非常基本的东西,我们深表歉意。

这是我的代码:

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

带有 Kotlin 片段的官方文档在这里:https://developer.android.com/guide/components/intents-common#ComposeEmail

我认为你的问题是你没有使用正确的文件路径。

以下对我有用:

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

编辑: 请求访问存储空间只是为了共享您的应用程序私有的文件可能不是一个好主意。幸运的是,经过一些配置后,从您的应用程序私有存储中共享文件非常容易。请参阅本指南:https://developer.android.com/training/secure-file-sharing/setup-sharing

如果您共享外部存储上的文件,您还需要通过如下清单文件授予用户权限

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

尝试使用 this.It 有效...

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

谢谢

对于较新的设备,您将遇到 FileUriExposedException。这是在 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
}