适配SDK21到30的Android应用如何检查ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION等存储权限
兼容API21-30的存储权限校验方案
你可以直接使用如下单行代码完成全版本权限校验:
boolean hasStoragePermission = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R ? Environment.isExternalStorageManager() : ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
逻辑说明
- 运行设备系统版本 ≥ Android 11(API 30):调用
Environment.isExternalStorageManager()判断是否已获取全文件访问权限,和官方权限机制完全对应 - 运行设备系统版本 ≤ Android 10(API 29):使用
ContextCompat.checkSelfPermission检查普通存储权限即可,且该方法天生兼容Android 5.x(API 21、22)的安装时授权机制,低于Android 6.0的设备会直接返回已授权
你也可以封装为独立工具方法方便调用:
public boolean isStoragePermissionGranted(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { return Environment.isExternalStorageManager(); } return ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; }
配套配置注意事项
你需要在AndroidManifest.xml中补充对应权限声明,保证全版本适配:
<!-- 安卓10及以下使用的存储权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 安卓11及以上使用的全文件管理权限 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" />
你现有的权限申请逻辑可以和上述校验方法配合,每次申请权限前先判断是否已经获得权限,避免重复发起申请。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

