gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:36:12 28 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:// 的步骤URI 与 content://网址:

  • 添加一个 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/46973634/

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