按Android版本适配图片读取权限:API33及以上与低版本切换方案
Android 不同API版本图片访问权限适配方案
要实现API 33及以上版本使用READ_MEDIA_IMAGES,API 33以下使用READ_EXTERNAL_STORAGE,需要从清单文件配置和代码动态申请两部分入手:
一、清单文件配置
你提供的权限声明需要调整,给READ_EXTERNAL_STORAGE添加android:maxSdkVersion="32"属性,这样系统只会在API 32及以下版本中生效该权限,API 33+版本会自动忽略它,只使用READ_MEDIA_IMAGES。
<!-- API 33以下版本适用的存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- API 33及以上版本适用的媒体图片权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
二、代码中动态申请权限
Android 6.0(API 23)及以上版本需要动态申请危险权限,所以要根据当前设备的API版本,选择对应的权限进行申请:
Kotlin 示例
private val REQUEST_CODE_STORAGE_PERMISSION = 1001 fun requestImageAccessPermission() { // 根据API版本选择要申请的权限 val targetPermission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { Manifest.permission.READ_MEDIA_IMAGES } else { Manifest.permission.READ_EXTERNAL_STORAGE } // 检查权限是否已授予 if (ContextCompat.checkSelfPermission(this, targetPermission) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(targetPermission), REQUEST_CODE_STORAGE_PERMISSION) } else { // 权限已授予,执行图片访问逻辑 accessImages() } } // 处理权限申请结果 override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == REQUEST_CODE_STORAGE_PERMISSION) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { accessImages() } else { // 权限被拒绝,提示用户开启权限 Toast.makeText(this, "需要授权才能访问图片", Toast.LENGTH_SHORT).show() } } } private fun accessImages() { // 这里编写访问本地图片的业务逻辑 }
Java 示例
private static final int REQUEST_CODE_STORAGE_PERMISSION = 1001; public void requestImageAccessPermission() { String targetPermission; // 根据API版本选择要申请的权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { targetPermission = Manifest.permission.READ_MEDIA_IMAGES; } else { targetPermission = Manifest.permission.READ_EXTERNAL_STORAGE; } // 检查权限是否已授予 if (ContextCompat.checkSelfPermission(this, targetPermission) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{targetPermission}, REQUEST_CODE_STORAGE_PERMISSION); } else { // 权限已授予,执行图片访问逻辑 accessImages(); } } // 处理权限申请结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_CODE_STORAGE_PERMISSION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { accessImages(); } else { Toast.makeText(this, "需要授权才能访问图片", Toast.LENGTH_SHORT).show(); } } } private void accessImages() { // 这里编写访问本地图片的业务逻辑 }
关键说明
android:maxSdkVersion的作用是限制权限仅在指定版本以下生效,避免API 33+版本中出现冗余的权限申请提示Build.VERSION_CODES.TIRAMISU是API 33的版本常量,直接使用它比硬编码33更规范- 动态申请权限的流程和普通危险权限一致,核心是根据API版本切换目标权限
内容的提问来源于stack exchange,提问作者HamTory
相关产品推荐
相关产品推荐

