Skip to content

处理 Scoped Storage

在 Android 11 及以上版本,Scoped Storage 机制更严格,应用对共享存储的访问会受到限制,从而可能影响文件读写与示例路径访问。本节用于说明常见影响点及可选处理方式,便于集成与排查时快速定位。

1. 如需禁用 Scoped Storage(可选)

您可以按以下任一方式在项目中 禁用 Scoped Storage:

  • 在 App 的 build.gradle 中,将 targetSdkVersion 设置为 <= 28
  • 在 App 的 build.gradle 中,将 targetSdkVersion 设置为 29,并在 AndroidManifest.xmlapplication 节点增加:
xml
android:requestLegacyExternalStorage="true"

2. 当 targetSdkVersion >= 30 时的配置建议

如果 targetSdkVersion >= 30,可通过以下配置降低 Scoped Storage 对项目的影响。

AndroidManifest.xml 中:

  1. manifest 节点添加:
xml
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
  1. 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