在 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);
}