最近我一直在努力解决这个问题,我想分享我使用支持库中的FileProvider找到的解决方案。它是内容提供商的扩展,它可以很好地解决这个问题,而且不需要太多的工作,而且工作量也不大。
如链接解释,以激活内容提供商: 在你的清单,写上:
<application
....
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.youdomain.yourapp.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
...
元数据应说明在res/XML文件夹中的XML文件(我把它命名为file_paths.xml ):
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path path="" name="document"/>
</paths>
的路径是空的,当你使用内部文件的文件夹,但如果更多的大致位置(我们现在谈论的内部存储路径),你应该使用其他路径。您编写的名称将用于内容提供商提供给该文件的网址。从RES/XML/file_paths.xml元数据的路径
Uri contentUri = FileProvider.getUriForFile(context, "com.yourdomain.yourapp.fileprovider", file);
上的任何文件
:
,现在,你可以简单地通过生成一个新的,世界可读的URL。
,现在只需使用:
Intent mailIntent = new Intent(Intent.ACTION_SEND);
mailIntent.setType("message/rfc822");
mailIntent.putExtra(Intent.EXTRA_EMAIL, recipients);
mailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
mailIntent.putExtra(Intent.EXTRA_TEXT, body);
mailIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
try {
startActivity(Intent.createChooser(mailIntent, "Send email.."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(this, R.string.Message_No_Email_Service, Toast.LENGTH_SHORT).show();
}
当你连接的URL文件,你不需要给予许可,您自动做到这一点。
并且您不需要创建文件MODE_WORLD_READABLE,现在不推荐使用此模式,使其成为MODE_PRIVATE,内容提供者将为其他应用程序可访问的同一文件创建新的url。
我应该注意到,我只在带有Gmail的模拟器上测试过它。
或者将'MODE_PRIVATE'改为'MODE_WORLD_READABLE'。由于您没有编写电子邮件程序,因此无法读取您的私人文件。 – CommonsWare 2011-05-20 13:53:42
感谢您的回答。我可以阅读,但我开发的应用程序没有外部存储的手机,因为手机有32GB的内置存储。 – 2011-05-20 13:58:08
然后使用@CommonsWare评论:MODE_WORLD_READABLE可以保存你。 – 2011-05-20 13:59:13