android.os.FileUriExposedException: file:///storage/emulated/0/image2065.jpg exposed beyond app through ClipData.Item.getUri()
时间: 2023-09-11 13:05:02 浏览: 311
项目配置说明和注意事项1
这个问题是由于 Android7.0 之后为了增强应用安全性而引入的权限机制导致的。当你在应用中通过 FileProvider 获取某个文件时,Android 系统会认为该文件是私有的,其他应用程序无法访问,这样就能提高应用的安全性。
解决这个问题的方法是使用 FileProvider 来获取文件 Uri。具体步骤如下:
1. 在 AndroidManifest.xml 文件中添加 FileProvider 的声明:
```
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
```
其中,`android:authorities` 属性的值应该是你的应用包名加上 `.fileprovider`,这个值将用于区分不同应用的 FileProvider;`android:grantUriPermissions` 属性表示该 provider 是否允许授予 URI 权限;`android:exported` 属性表示该 provider 是否允许其他应用访问;`android.support.FILE_PROVIDER_PATHS` 属性指向一个 xml 文件,该文件定义了你要共享的文件的路径。
2. 在 res/xml 目录下创建一个名为 file_paths.xml 的文件,用于定义你要共享的文件路径:
```
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
```
其中,`<external-path>` 标签表示你要共享的文件路径,`name` 属性可以随意指定,`path` 属性指向你要共享的文件或目录的路径。在本例中,我们指定共享外部存储器中的文件,`path` 属性的值为 `.` 表示共享整个外部存储器。
3. 最后,使用 FileProvider.getUriForFile() 方法来获取文件 Uri:
```
File file = new File("/storage/emulated/0/image2065.jpg");
Uri uri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".fileprovider", file);
```
其中,`context` 表示当前上下文,`getApplicationContext().getPackageName() + ".fileprovider"` 表示 FileProvider 的 authorities,`file` 表示你要获取 Uri 的文件。
通过使用 FileProvider,应用就能够安全地共享文件了。
阅读全文