返回

Android 13 读写 SD 卡权限的调整适配指南

Android

Android 13 中 Scoped Storage:读写 SD 卡权限的重大调整

摘要:
Android 13 对读写 SD 卡权限进行了重大调整,引入了 Scoped Storage 机制。这有助于加强对用户数据和隐私的保护,但也会对应用的开发和适配带来影响。本文将详细介绍这些调整,并提供适配指南,帮助开发者轻松应对这些变化。

1. 背景与目的

在 Android 13 之前,应用可以通过在清单文件中声明权限来访问外部存储。然而,这带来了以下问题:

  • 应用可以访问用户所有文件,包括私人文件。
  • 应用可以修改或删除用户文件,导致数据丢失。
  • 应用可以访问其他应用的文件,引发安全隐患。

2. Scoped Storage 机制

Scoped Storage 机制将外部存储分为两部分:内部存储和外部存储。内部存储由应用独享,而外部存储仅允许应用访问自己创建的文件。要访问外部存储,应用必须在运行时向用户请求权限。

3. 适配指南

清单文件:
在清单文件中声明文件访问权限:

<manifest ...>
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

运行时请求权限:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
  ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_READ_EXTERNAL_STORAGE_REQUEST_CODE);
}

处理权限请求结果:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
  switch (requestCode) {
    case MY_READ_EXTERNAL_STORAGE_REQUEST_CODE:
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        // 用户同意了读写权限
      } else {
        // 用户拒绝了读写权限
      }
      break;
  }
}

4. 注意要点

  • Scoped Storage 仅适用于新安装的应用。
  • Scoped Storage 并非适用于所有文件类型,例如 /sdcard/Android/data/<package name> 目录下的文件。
  • Scoped Storage 可能会影响应用性能,应避免频繁访问外部存储。

5. 常见问题解答

  1. 为什么需要 Scoped Storage?
    为了加强用户数据和隐私保护,防止应用滥用文件访问权限。

  2. Scoped Storage 如何影响应用的开发?
    需要向用户请求文件访问权限,并根据用户的选择进行相应处理。

  3. 哪些文件不受 Scoped Storage 限制?
    /sdcard/Android/data/<package name> 目录下的文件不受限制。

  4. Scoped Storage 对应用的性能有什么影响?
    频繁访问外部存储可能会导致性能下降,应尽量避免。

  5. 如何判断应用是否遵守 Scoped Storage?
    可以在 Android Studio 的 Logcat 中查看权限请求日志或使用第三方工具检查应用的权限使用情况。