Android文件共享——使用FileProvider轻松完成
更新:2023-05-14 06:57
一、FileProvider介绍
FileProvider是Android支持库中的一个类,用于解决在Android应用间共享文件的问题。通常情况下,我们通过File类来获取一个文件的路径,但在Android 7.0及以上的版本中,由于更加严格的安全机制,直接使用File的方法已经不能满足我们的需求了。这时需要使用FileProvider来管理我们的文件。
二、使用FileProvider实现文件共享
接下来,我们将通过一个简单的例子来演示如何使用FileProvider实现文件共享。
1.在AndroidManifest.xml中声明FileProvider
<!-- 定义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/provider_paths" />
</provider>
在provider标签的authorities属性中填写FileProvider的权限名。注意,这个权限名需要和后面要声明的path中的路径对应。 meta-data标签中的resource属性指向了provider_paths.xml文件,这个文件定义了我们要共享的文件路径。接下来,我们将详细介绍这个文件的内容。
2.在res/xml文件夹下创建provider_paths.xml文件
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<root-path name="root" path="." />
<files-path name="files" path="." />
<cache-path name="cache" path="." />
<external-path name="external" path="." />
<external-files-path name="external_files" path="." />
<external-cache-path name="external_cache" path="." />
</paths>
在这个文件中,我们可以定义多种路径,以便于共享多个文件。这里我定义了6种路径类型(root, files, cache, external, external_files, external_cache),分别对应于应用内部存储、应用内部文件存储、应用内部缓存存储、外部存储、外部存储文件存储、外部缓存存储。
3.通过FileProvider.getUriForFile()方法获取文件Uri
private Uri getFileUri(Context context, File file) {
return FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".fileprovider", file);
}
利用getContext().getApplicationContext()获取Application上下文并拼接FileProvider的权限名,通过FileProvider.getUriForFile()方法获取文件Uri。
4.使用共享的Uri
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("application/vnd.android.package-archive");
Uri uri = getFileUri(getContext(), new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "test.apk"));
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
getContext().startActivity(intent);
将获取到的Uri放入Intent中,通过addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)给其他应用授予读取共享文件的权限。
三、小结
本文主要介绍了FileProvider的使用方法,只需要声明好FileProvider,定义好文件路径,通过FileProvider.getUriForFile()获取文件Uri,最后将Uri放入Intent中即可达到文件共享的目的。与直接使用File的方法相比,使用FileProvider不仅更加安全,而且在Android 7.0及以上版本中更加必要。