Android 7.0 共享文件适配

149 阅读1分钟

在 Android 7.0 及更高版本中,为了安全性考虑,Android 框架禁止在应用外部直接公开 file:// URI。为了在应用之间安全共享文件,您应使用 FileProvider 来发送 content:// URI,并授予对该 URI 的临时访问权限。以下是优化后的使用指南:

使用 FileProvider

1. 定义 FileProvider

AndroidManifest.xml 中定义 FileProvider

<application>
    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>
</application>

2. 配置 file_paths.xml 文件

res/xml/ 目录下创建 file_paths.xml 文件:

<paths>
    <external-path name="my_files" path="." />
</paths>

3. 使用 FileProvider 共享文件

通过定义的 FileProvider 获取文件的 content:// URI:

File file = new File(getExternalFilesDir(null), "example.jpg");
Uri fileUri = FileProvider.getUriForFile(this, getApplicationContext().getPackageName() + ".fileprovider", file);

4. 低版本适配

为了兼容 Android 7.0 以下的版本,可以通过以下方法获取 URI:

public static Uri getUriForFile(Context context, File file) {
    Uri fileUri = null;
    if (Build.VERSION.SDK_INT >= 24) {
        fileUri = getUriForFile24(context, file);
    } else {
        fileUri = Uri.fromFile(file);
    }
    return fileUri;
}

public static Uri getUriForFile24(Context context, File file) {
    return androidx.core.content.FileProvider.getUriForFile(context,
            context.getPackageName() + ".fileprovider",
            file);
}

参考资源