当我尝试打开文件时,应用程序崩溃了。它在 Android Nougat 下工作,但在 Android Nougat 上它会崩溃。只有当我尝试从 SD 卡而不是系统分区打开文件时,它才会崩溃。一些权限问题?
示例代码:
File file = new File("/storage/emulated/0/test.txt");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "text/*");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent); // Crashes on this line
日志:
android.os.FileUriExposedException: file:///storage/emulated/0/test.txt 通过 Intent.getData() 暴露在应用程序之外
编辑:
以 Android Nougat 为目标时,不再允许使用 file://
URI。我们应该使用 content://
URI 来代替。但是,我的应用程序需要在根目录中打开文件。有任何想法吗?
原文由 Thomas Vos 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您的
targetSdkVersion >= 24
,那么我们必须使用FileProvider
类来授予对特定文件或文件夹的访问权限,以便其他应用程序可以访问它们。我们创建自己的类继承FileProvider
以确保我们的 FileProvider 不会与 此处 所述的导入依赖项中声明的 FileProvider 冲突。将
file://
URI 替换为content://
URI 的步骤:AndroidManifest.xml
标签下的 --- 添加一个 FileProvider<provider>
<application>
标签。为android:authorities
属性指定唯一权限以避免冲突,导入的依赖项可能指定${applicationId}.provider
和其他常用权限。res/xml
文件夹中创建一个provider_paths.xml
--- 文件。如果文件夹尚不存在,则可能需要创建它。该文件的内容如下所示。它描述了我们希望共享对根文件夹(path=".")
的外部存储的访问权限,名称为 external_files 。至
请参阅 此处已解释的完整代码和解决方案。