Android应用使用Dexter请求外部存储读取权限无弹窗问题
我在Android应用中使用Dexter框架请求READ_EXTERNAL_STORAGE权限以读取手机歌曲,但应用启动后权限请求弹窗完全不显示。已完成的配置如下:
- Dexter代码配置:
Dexter.withContext(this) .withPermission(Manifest.permission.READ_EXTERNAL_STORAGE) .withListener(new PermissionListener() { @Override public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) { Toast.makeText(MainActivity.this, "Runtime Permission given", Toast.LENGTH_SHORT).show(); } @Override public void onPermissionDenied(PermissionDeniedResponse permissionDeniedResponse) { } @Override public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) { permissionToken.continuePermissionRequest(); } }) .check();
- AndroidManifest.xml权限声明:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
- build.gradle依赖引入:
implementation 'com.karumi:dexter:6.2.3'
已导入android.Manifest,期望出现权限请求弹窗。以下是针对性的解决办法:
适配Android 13+的权限变更
Android 13(API 33)及以上版本中,READ_EXTERNAL_STORAGE权限已被废弃,读取音频文件需要使用READ_MEDIA_AUDIO权限。此时请求旧权限不会触发弹窗,系统会直接视为已授予。
修改代码中的权限为Manifest.permission.READ_MEDIA_AUDIO,同时在Manifest中添加对应权限声明:<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />处理权限永久拒绝的情况
如果用户之前勾选了"不再询问"并拒绝权限,Dexter不会再弹出请求弹窗,直接进入onPermissionDenied回调。可以在该方法中添加逻辑引导用户前往应用设置页手动开启权限:@Override public void onPermissionDenied(PermissionDeniedResponse permissionDeniedResponse) { if (permissionDeniedResponse.isPermanentlyDenied()) { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent); } }确认权限请求的执行时机
确保权限请求代码在Activity的onCreate、onResume等生命周期方法中执行,且Activity已完成初始化。避免在非UI线程或未绑定有效上下文的场景(如Application的onCreate)中调用。验证依赖同步状态
执行File -> Sync Project with Gradle Files确保Dexter依赖已正确导入项目。若存在依赖冲突,可通过gradlew app:dependencies命令查看依赖树,排除冲突的第三方库。检查系统权限管理设置
部分国产ROM(如小米、华为)自带自动权限管理功能,可能默认授予或屏蔽权限请求弹窗。可前往手机设置的应用权限页面,重置当前应用的权限状态后重新测试。
内容的提问来源于stack exchange,提问作者randeepsarma24

