FileProvider 的使用

FileProvider 的使用

Dev Doc

https://developer.android.google.cn/reference/androidx/core/content/FileProvider

0x01 定义一个FileProvider

在 androidx 包提供的 FileProvider 提供了 生成文件Uri 的功能。

在 manifest 文件中,声明一个 provider

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<manifest>
...
<application>
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"
tools:replace="android:resource" />
</provider>
...
</application>
</manifest>

0x02 可用文件路径配置

在 res/xml/file_paths.xml 下配置可用的文件路径,FileProvider 只能生成配置了的文件Uri。每个你想要生成Uri的文件路径都需要在 paths 下面定义。

1
2
3
4
5
6
7
8
9
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="my_images" path="images/"/>
<cache-path name="name" path="path" />
<external-path name="name" path="path" />
<external-files-path name="name" path="path" />
<external-cache-path name="name" path="path" />
<external-media-path name="name" path="path" />
...
</paths>

0x03 生成一个Uri

和其他 app 共享一个文件,你需要生成一个Uri。

1
2
3
4
5
6
7
8
9
File imagePath = new File(Context.getFilesDir(), "my_images");
File newFile = new File(imagePath, "default_image.jpg");

Uri uriForFile;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
uriForFile = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", newFile);
} else {
uriForFile = Uri.parse("file://" + newFile.toString());
}

getUriForFile() 返回一个 content URI content://com.mydomain.fileprovider/my_images/default_image.jpg.

0x04 授予权限

1
2
3
shareContentIntent.setClipData(ClipData.newRawUri("", contentUri));
shareContentIntent.addFlags(
Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
  1. Put the content URI in an Intent by calling setData().
  2. Call the method Intent.setFlags() with either Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION or both.
  3. Send the Intent to another app. Most often, you do this by calling setResult().

0x05 提供Uri给其他app

1
2
3
4
5
// 使用uri
Intent i = new Intent(Intent.ACTION_VIEW);
i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
i.setDataAndType(uriForFile, "application/vnd.android.package-archive");
mContext.startActivity(i);
作者

Dench

发布于

2021-12-07

更新于

2021-12-07

许可协议

CC BY-NC-SA 4.0

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×