前言
最近在写 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
为你程序的包名,请勿无脑复制粘贴。
- 注册 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>
- 在
res/xml/
下新建 xml 文件provider_paths.xml
,在其中指定程序可访问的路径。
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="files_root" path="."/>
</paths>
- 在程序调用代码:
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)