1

我的意图是使用 FileProvider 从内部文件存储中读取我的应用程序以通过电子邮件(或类似应用程序)发送文件。该代码显然在任何地方都很好用,除了 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;
}

这是启动活动的代码:

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

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

任何线索如何防止这种情况?

4

1 回答 1

2

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

代替:

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

和:

i.setType("message/rfc822");

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

于 2016-03-30T15:32:52.550 回答