使用 FileProvider 附件按意图添加到电子邮件的杂散文件路径

Stray file path added to email on intent using FileProvider attachment

我有一个意图,使用 FileProvider 从我的应用程序的内部文件存储中读取,以通过电子邮件(或类似应用程序)发送文件。该代码显然在除 Gmail 之外的任何地方都运行良好,Gmail 奇怪地将提供商路径本身的一个版本添加到电子邮件的收件人列表中。

这是生成意图的代码:

public static Intent getSendIntent(Uri uri) {
    final Intent i = new Intent(Intent.ACTION_SEND);
    i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    i.setDataAndType(uri, "message/rfc822");
    i.putExtra(Intent.EXTRA_EMAIL, new String[] { "my@email.com" });
    i.putExtra(Intent.EXTRA_SUBJECT, "Export");
    i.putExtra(Intent.EXTRA_TEXT, "See the attached...");
    i.putExtra(Intent.EXTRA_STREAM, uri);
    return i;
}

这是启动 activity 的代码:

File file = new File(getFilesDir(), filename);
Uri uri = FileProvider.getUriForFile(MainActivity.this, "com.example.myapplication.provider", file);
Intent i = Utils.getSendIntent(uri);

try {
    startActivity(Intent.createChooser(i, "Send file..."));
} catch (Exception e) {
    Log.d(TAG, "failed to start send activity: " + e.getMessage());
    Toast.makeText(MainActivity.this, "No suitable activity found for export.", Toast.LENGTH_SHORT).show();
}

在 Slack、Evernote 等中效果很好,但在 Gmail 中除了我提供的电子邮件地址外,还添加了这种格式的另一个收件人:

//com.example.myapplication.provider/my_files/filefile.csv

这会阻止电子邮件发送,直到它被手动从消息中删除。关于消息的其他一切都符合预期。

知道如何防止这种情况发生吗?

以下 Captain Obvious 解决方案解决了问题。

替换:

i.setDataAndType(uri, "message/rfc822");

与:

i.setType("message/rfc822");

因为正如@CommonsWare 的问题所推断的那样,文件内容本身并不是 rfc822 格式。