1. AndroidMainfest.xml
定义provider标签
<!-- 此处的.provider.ShowroomProvider是继承自androidx.core.content.FileProvider,也可以直接改为androidx.core.content.FileProvider,通过继承的好处是可以指定另外的provider-->
<provider android:authorities="${applicationId}.provider"
android:name=".provider.ShowroomProvider"
android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_path"/>
</provider>
2. @xml/file_path.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<!--此处的根标签表示,可以访问外部私有file目录 .表示目录下的所有文件-->
<external-files-path
name="external-files-path"
path="."/>
</paths>
3.Activity中使用
// 如果SDK的版本>=Android N,使用FileProvider获取Uri,否则直接使用Uri.fromFile(file)方法
val uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
FileProvider.getUriForFile(
activity,
activity.packageName + ".provider",
file
)
else
Uri.fromFile(file)
4. @xml/file_path.xml中二级根标签的可选值与含义
标签名称 | 对应Kotlin/java 方法 | 作用 |
---|---|---|
files-path | Context.getFilesDir() | 读取内置存储区中files文件夹下的指定目录或者文件 |
cache-path | Context.getCacheDir() | 读取内置存储区中cache文件夹下指定目录或者文件 |
external-path | Environment.getExternalStorageDirectory() | 读取外部存储根目录下指定目录或者文件 |
external-files-path | Context#getExternalFilesDir(String) Context.getExternalFilesDir(null) | 读取外部存储区私有目录下files目录下指定目录或者文件 |
external-cache-path | Context.getExternalCacheDir() | 读取外部存储区私有目录下cache目录下指定目录或文件 |
external-media-path | Context.getExternalMediaDirs() | 读取外部存储区私有目录下media目录下指定目录或文件 |