适配Android 13(API33)时READ_MEDIA权限代码引用未解析的处理方案
解决Android 13(API 33)媒体权限动态申请的“unresolved reference”问题
你遇到的Manifest.permission.READ_MEDIA_IMAGES找不到引用的问题,核心原因是项目的编译SDK版本未升级到API 33——这些媒体权限是Android 13新增的,只有编译SDK版本>=33时,系统才会提供对应的权限常量。以下是完整的解决步骤:
1. 升级项目编译及目标SDK版本
打开模块级的build.gradle(或build.gradle.kts)文件,将compileSdk和targetSdk都设置为33:
android { compileSdk 33 defaultConfig { targetSdk 33 // 其他原有配置(minSdk、applicationId等)保持不变 } // 其他配置 }
如果使用KTS语法:
android { compileSdk = 33 defaultConfig { targetSdk = 33 // 其他原有配置 } }
同步项目后,Manifest.permission下的READ_MEDIA_IMAGES、READ_MEDIA_VIDEO常量就能正常引用了。
2. 兼容多版本的权限申请逻辑
由于旧版本Android(<API 33)仍使用READ_EXTERNAL_STORAGE权限,需要根据系统版本动态切换申请的权限数组:
Kotlin示例:
import android.Manifest import android.os.Build import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { // 注册权限申请启动器 private val requestMediaPermissions = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissionResults -> // 检查所有权限是否授予 val isAllGranted = permissionResults.values.all { it } if (isAllGranted) { // 权限已授予,执行媒体访问逻辑 } else { // 权限被拒绝,可引导用户到应用设置页开启权限 } } // 调用权限申请的方法 private fun requestMediaAccessPermissions() { val permissionsToRequest = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // Android 13及以上,申请新的媒体权限 arrayOf( Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO ) } else { // 旧版本,申请外部存储读取权限 arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE) } requestMediaPermissions.launch(permissionsToRequest) } }
Java示例:
import android.Manifest; import android.os.Build; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private ActivityResultLauncher<String[]> requestMediaPermissions; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册权限申请启动器 requestMediaPermissions = registerForActivityResult( new ActivityResultContracts.RequestMultiplePermissions(), permissionResults -> { boolean isAllGranted = true; for (Boolean granted : permissionResults.values()) { if (!granted) { isAllGranted = false; break; } } if (isAllGranted) { // 权限已授予,执行媒体访问逻辑 } else { // 权限被拒绝,引导用户到设置页 } } ); } // 调用权限申请 private void requestMediaAccessPermissions() { String[] permissionsToRequest; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { permissionsToRequest = new String[]{ Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO }; } else { permissionsToRequest = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}; } requestMediaPermissions.launch(permissionsToRequest); } }
3. 额外注意事项
- 确保你的Android Gradle Plugin(AGP)版本支持API 33,建议使用AGP 7.3.0及以上版本;
- 若项目依赖
androidx.core库,建议升级到1.9.0及以上,避免兼容性问题; - 即使在Android 13上,
READ_MEDIA_IMAGES和READ_MEDIA_VIDEO仍需动态申请,仅在Manifest中声明无法触发权限弹窗。
内容的提问来源于stack exchange,提问作者1048576
相关产品推荐
相关产品推荐

