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);
|
- Put the content URI in an
Intent
by calling setData()
.
- Call the method
Intent.setFlags()
with either Intent.FLAG_GRANT_READ_URI_PERMISSION
or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
or both.
- Send the
Intent
to another app. Most often, you do this by calling setResult()
.
0x05 提供Uri给其他app
1 2 3 4 5
| 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);
|