gpt4 book ai didi

android.os.FileUriExposedException : file:///storage/emulated/0/test. txt 通过 Intent.getData() 暴露在应用程序之外

转载 作者:IT老高 更新时间:2023-10-28 12:48:36 35 4
gpt4 key购买 nike

当我尝试打开文件时,应用程序崩溃了。它在 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 exposed beyond app through Intent.getData()

编辑:

针对 Android Nougat 时,不再允许使用 file:// URI。我们应该改用 content:// URI。但是,我的应用程序需要在根目录中打开文件。有什么想法吗?

最佳答案

如果您的 targetSdkVersion >= 24 , 那么我们必须使用 FileProvider类以授予对特定文件或文件夹的访问权限,以使其他应用程序可以访问它们。我们创建自己的类继承 FileProvider为了确保我们的 FileProvider 不会与在导入的依赖项中声明的 FileProvider 冲突,如 here 所述.

更换步骤file://带有 content:// 的 URI网址:

  • 添加 FileProvider <provider>标记 AndroidManifest.xml<application> 下标签。为 android:authorities 指定唯一权限属性以避免冲突,导入的依赖项可能会指定 ${applicationId}.provider和其他常用的权威机构。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
...
<application
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
</application>
</manifest>
  • 然后创建一个provider_paths.xml文件在 res/xml文件夹。如果文件夹尚不存在,则可能需要创建它。该文件的内容如下所示。它描述了我们希望共享对根文件夹 (path=".") 的外部存储的访问权限。名称为 external_files
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="external_files" path="."/>
</paths>
  • 最后一步是更改下面的代码行

     Uri photoURI = Uri.fromFile(createImageFile());

     Uri photoURI = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", createImageFile());
  • 编辑:如果您使用 Intent 让系统打开您的文件,您可能需要添加以下代码行:

     intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

请引用已解释的完整代码及解决方案here.

关于android.os.FileUriExposedException : file:///storage/emulated/0/test. txt 通过 Intent.getData() 暴露在应用程序之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38200282/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com