Android 14 平台程序开发中文件共享权限问题

Android 14 平台程序开发中文件共享权限问题

日暮清林
2024-02-01 / 0 评论 / 26 阅读 / 正在检测是否收录...

前言

最近在写 Android 应用项目,在 App 内部存储(/data/data/<package_name>/)的 context files 里存了一个文件。想要调用系统程序打开。结果报错 FileUriExposedException

原因

​​‌‌​​​‌‌​‌​​‌‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​‌​‌‌​​​‌‌​​​​​‍​​‌​‌‌‌‌‌‌‌‌​​​‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​‌‌​​​‌‌‌​​​‌​‌‍​​‌‌‌‌‌‌‌‌​​‌‌‍‌​‌‌‌‌‌​‍‌​​‌​​​‌‍‌​​‌‌​‌‌‍‌​​​‌‌​‌‍‌​​‌​​​​‍‌​​‌​‌‌​‍‌​​‌‌​‌‌‍‌‌​‌‌‌‌‌‍‌‌​​‌‌‌​‍‌‌​​‌​‌‌‍‌‌​‌‌‌‌‌‍​‌​​​​‌‌​​​‌‌​​‍​‌​‌‌​​​​​​‌‌‌‌‍​​​​‌​‌‌‌‌‌​‌​​‍​‌​​​​‌​‌‌‌​​​​‍​‌​​​​​‌‌‌‌‌‌‌‌‍​‌​‌‌​​​​‌​‌‌‌​‍​‌‌​​​‌‌‌​‌​​‌​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌‌​​​‌​​​​‌​​‌‍​‌​‌‌‌​‌​​​‌‌‌​‍​‌‌​​​‌​‌​‌​‌​​‍​​‌‌​​​‌​‌‌‌‌​​‍​‌‌​‌​​‌‌​‌​‌‌‌‌‍​‌‌​‌​‌​​​​‌​​​‌‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​​‌‌‌‌‌‌‌‌​​‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​​​‌​‌​‌‌​​‌‌‌​‍‌​‌‌​​‌‌‍‌​​‌‌​‌​‍‌​​​‌​​‌‍‌​​‌​‌‌​‍‌​‌​​​​​‍‌​‌‌​​‌​‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​​‌​​‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍​‌‌​​​‌​‌‌‌​​​‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​​‌‌​‌‍‌‌​​‌​‌‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌‌​‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌‌‌​‍​‌​‌‌​‌‌‌‌​​‌​​‍​‌‌​​​​‌​‌​​​‌‌‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌​‌​​​‌‌​​‌‌‌‌‍​‌​‌​​​‌​‌‌‌‌‌‌‍​​​​​​​​‌‌‌​​‌​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​​‌‌‌‌‍‌​​​‌‌​​‍‌‌​​​‌​‌‍‌​‌​​​‌‌‍‌​‌​​​‌‌‍‌​​‌​‌​​‍‌​​​​‌‌​‍‌​​‌​​‌‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌‌​‌​​​‌‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​‌​​​‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌​‍‌​​​‌​‌‌‍‌​​‌​​​​‍‌​​​‌‌​‌‍‌​​‌​‌‌​‍‌​​‌‌‌‌​‍‌​​‌​​‌‌‍‌​​​‌‌​​‍‌​‌​​​‌‌‍‌​​‌‌‌‌​‍‌​​​‌‌‌‌‍‌​​​‌‌‌‌‍‌‌​‌​​‌​‍‌​​‌‌​​‌‍‌​​‌​‌‌​‍‌​​‌​​‌‌‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌‌​‌​​‌​‍‌​​​‌‌​​‍‌​​‌​‌‌‌‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌​​‌‌​​​‍‌‌​‌​​‌​‍‌​​​‌‌‌‌‍‌​​‌‌​‌​‍‌​​​‌‌​‌‍‌​​‌​​‌​‍‌​​‌​‌‌​‍‌​​​‌‌​​‍‌​​​‌‌​​‍‌​​‌​‌‌​‍‌​​‌​​​​‍‌​​‌​​​‌‍‌‌​‌​​‌​‍‌​​‌​‌‌​‍‌​​​‌‌​​‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​​‌‌​‌​‍‌‌​‌​​‌​‍‌​​‌​​​​‍‌​​‌​​​‌‍‌‌​‌​​‌​‍‌​​‌‌‌‌​‍‌​​‌​​​‌‍‌​​‌‌​‌‌‍‌​​​‌‌​‌‍‌​​‌​​​​‍‌​​‌​‌‌​‍‌​​‌‌​‌‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌​‍‌‌​​‌​‌‌‍‌‌​‌​​​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​‌​​‌​‍‌​​‌​​‌‌

自从 Android 7 开始,应用间的文件共享必须使用 content:// scheme 的 Uri 来访问,而通常从 File 对象获取到的 Uri 均为 file:// 的 scheme。而 Google 禁止应用程序间使用 file:// 的 Uri 来共享文件。

解决方案

试过直接禁用严格模式(StrictMode) 但是没有用。因此需要在清单文件 AndroidManifest.xml 中注册程序的 FileProvider,随后使用 FileProvider 获取文件的 content:// Uri。

代码

自行替换下面代码部分内容中的包名 com.example.application1 为你程序的包名,请勿无脑复制粘贴。

  1. 注册 FileProvider
<application>
...
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.example.application1.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>
...
</application>
  1. res/xml/ 下新建 xml 文件 provider_paths.xml,在其中指定程序可访问的路径。
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path name="files_root" path="."/>
</paths>
  1. 在程序调用代码:
        val fileUri: Uri = FileProvider.getUriForFile(
            this,
            "com.example.application1.provider",
            File(filesDir, RESULT_FILE_NAME)
        )
        val intent = Intent(Intent.ACTION_VIEW).apply {
            data = fileUri
            addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        }
        startActivity(intent)
0

评论 (0)

取消