Android 14中READ_EXTERNAL_STORAGE权限请求不触发及回调失效问题
Android 14下音乐播放器权限请求后onRequestPermissionsResult未触发的解决方法
问题核心原因
Android 14(API 34)中,READ_EXTERNAL_STORAGE权限已被废弃,针对音频文件的读取需使用READ_MEDIA_AUDIO权限。你当前请求的是旧权限,Android 14系统不会正确处理该请求,因此不会回调onRequestPermissionsResult方法。
解决步骤
1. 更新Manifest权限声明
替换或补充Manifest中的权限配置,兼容新旧版本:
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <!-- 仅在Android 12及以下版本生效 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
2. 修改权限请求代码
将请求的权限替换为READ_MEDIA_AUDIO:
private static final int REQUEST_PERMISSION = 100; // 权限检查与请求逻辑 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_AUDIO) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_MEDIA_AUDIO}, REQUEST_PERMISSION); } else { getSongs(); }
此时onRequestPermissionsResult方法会正常触发,无需修改回调逻辑(确保REQUEST_PERMISSION常量一致即可)。
3. (推荐)迁移到Activity Result API
onRequestPermissionsResult已被标记为过时,AndroidX推荐使用Activity Result API处理权限请求,逻辑更简洁且避免回调异常:
private ActivityResultLauncher<String> requestAudioPermissionLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化权限请求器 requestAudioPermissionLauncher = registerForActivityResult( new ActivityResultContracts.RequestPermission(), isGranted -> { if (isGranted) { getSongs(); } else { // 权限被拒绝后的处理逻辑 } }); // 检查并请求权限 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_AUDIO) != PackageManager.PERMISSION_GRANTED) { requestAudioPermissionLauncher.launch(Manifest.permission.READ_MEDIA_AUDIO); } else { getSongs(); } }
该方式无需重写onRequestPermissionsResult,系统会直接回调到注册的逻辑中,稳定性更高。
内容的提问来源于stack exchange,提问作者Youssef Hassan
相关产品推荐
相关产品推荐

