Android文件共享——使用FileProvider轻松完成

发布时间:2023-12-08

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