一、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及以上版本中更加必要。