返回
Android 13 读写 SD 卡权限的调整适配指南
Android
2023-09-13 02:13:22
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. 常见问题解答
-
为什么需要 Scoped Storage?
为了加强用户数据和隐私保护,防止应用滥用文件访问权限。 -
Scoped Storage 如何影响应用的开发?
需要向用户请求文件访问权限,并根据用户的选择进行相应处理。 -
哪些文件不受 Scoped Storage 限制?
/sdcard/Android/data/<package name>
目录下的文件不受限制。 -
Scoped Storage 对应用的性能有什么影响?
频繁访问外部存储可能会导致性能下降,应尽量避免。 -
如何判断应用是否遵守 Scoped Storage?
可以在 Android Studio 的 Logcat 中查看权限请求日志或使用第三方工具检查应用的权限使用情况。