处理 Scoped Storage
在 Android 11 及以上版本,Scoped Storage 机制更严格,应用对共享存储的访问会受到限制,从而可能影响文件读写与示例路径访问。本节用于说明常见影响点及可选处理方式,便于集成与排查时快速定位。
1. 如需禁用 Scoped Storage(可选)
您可以按以下任一方式在项目中 禁用 Scoped Storage:
- 在 App 的
build.gradle中,将targetSdkVersion设置为<= 28。 - 在 App 的
build.gradle中,将targetSdkVersion设置为29,并在AndroidManifest.xml的application节点增加:
xml
android:requestLegacyExternalStorage="true"
2. 当 targetSdkVersion >= 30 时的配置建议
如果 targetSdkVersion >= 30,可通过以下配置降低 Scoped Storage 对项目的影响。
在 AndroidManifest.xml 中:
- 在
manifest节点添加:
xml
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
- 在
application节点添加:
xml
android:requestLegacyExternalStorage="true"
android:preserveLegacyExternalStorage="true"
3. 运行时授权(示例代码)
在 MainActivity.java 中,按需增加如下代码以请求运行时权限授权:
java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (!Environment.isExternalStorageManager()) {
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.setData(Uri.parse("package:" + getApplicationContext().getPackageName()));
startActivityForResult(intent, REQUEST_ALL_FILES_ACCESS_PERMISSION);
return;
}
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int permission = ContextCompat.checkSelfPermission(this.getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
return;
}
}
如需在 Scoped Storage 启用情况下进行适配,可参考“功能完整的 PDF 阅读器(UI Extensions)”示例中 MainActivity.java 的权限处理与文件访问相关逻辑。
更多信息可参考“基础阅读器(PDFViewCtrl)”示例中的 MainActivity.java。