【发布时间】:2017-02-28 17:32:51
【问题描述】:
我想通过 gmail 或其他电子邮件应用发送存储在应用内部缓存中的文本文件。我添加了 FileProvider 以授予对文件的一次性访问权限。
当我在装有 Android 5.0 的设备上运行我的应用程序时,它可以工作。当我在 6.0 的设备上运行它时,它失败了。一个失败就是一个例外:
未找到处理 Intent 的 Activity { act=android.intent.action.SEND flg=0x3 clip={null T:Log file attach.}(有额外内容)}
当我省略 intent.setDataAndType (uri, "text/plain") 时会发生这种情况。
如果我确实包含了上面的语句,另一个失败是来自 gmail 的错误。它显示了带有图形的附件文件名,使我相信它可以正确访问它。它还在“to”行中显示附件的路径 - 本质上是 uri,但缺少“file:”前缀。如果我尝试发送消息,它会给我一条错误消息:“地址无效。”如果我从“收件人”行中删除这个虚假地址,我可以成功发送带有附件的邮件。
换句话说,我对 FileProvider 的使用,包括各种“设置”文件,似乎都在工作。我显然在某个地方有问题,也许是在 Intent 用法中。这是我的代码 - 带有虚假“收件人”地址的后一个版本。
清单:
<application
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.myapp.file_access"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
</application>
filepaths.xml(在 res/xml 目录中):
<?xml version="1.0" encoding="utf-8"?>
<paths>
<cache-path path="./" name="files" />
</paths>
创建意图的代码:
public static void sendFile (Context context, String path)
{
File file = new File (path);
Uri uri = FileProvider.getUriForFile (context, "com.myapp.file_access", file);
Intent intent = new Intent (Intent.ACTION_SEND);
intent.putExtra (Intent.EXTRA_EMAIL, new String[] {"you@gmail.com"});
intent.putExtra (Intent.EXTRA_SUBJECT, "your file");
intent.putExtra (Intent.EXTRA_STREAM, uri);
intent.putExtra (Intent.EXTRA_TEXT, "file attached.");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.setDataAndType (uri, "text/plain");
context.startActivity (intent);
}
【问题讨论】:
标签: android gmail android-fileprovider