Android中用Dexter v6.2.3申请RECORD_AUDIO权限遇REQUEST_ONGOING错误求助
使用Dexter v6.2.3申请RECORD_AUDIO权限时触发REQUEST_ONGOING错误的解决方法
我在Android Studio中使用Dexter v6.2.3处理RECORD_AUDIO权限申请时,withErrorListener方法触发了错误,错误信息为REQUEST_ONGOING。已在Manifest.xml中声明该权限,相关代码、依赖配置及Logcat日志如下:
权限申请代码
Dexter.withActivity(MainActivity.this).withPermission(android.Manifest.permission.RECORD_AUDIO).withListener(new PermissionListener() { @Override public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) { showSpeechSheetDialog(); } @Override public void onPermissionDenied(PermissionDeniedResponse permissionDeniedResponse) { if (permissionDeniedResponse.isPermanentlyDenied()) { showCustomDialog("Permission Required", "Record audio permission required to use this feature. You can grant this permission in app settings.", "Cancel", null, "Go to Settings", new View.OnClickListener() { @Override public void onClick(View v) { dialog.cancel(); Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent); } }); } } @Override public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) { permissionToken.continuePermissionRequest(); } }).withErrorListener(new PermissionRequestErrorListener() { @Override public void onError(DexterError dexterError) { Log.e("Dexter error", dexterError.toString()); } }).check();
依赖配置
implementation 'com.karumi:dexter:6.2.3'
Logcat日志
2023-08-20 13:59:40.595 6153-6153 Dexter error com.pratapbrothers.dotted.pizza E REQUEST_ONGOING
问题原因及解决办法
REQUEST_ONGOING错误表示当前已有未完成的权限请求在处理中,Dexter不允许同时发起多个权限请求。
解决步骤:
- 排查重复调用:确认权限申请代码是否被多次触发(比如按钮重复绑定点击事件、生命周期方法中重复调用)。如果是点击触发,确保事件只绑定一次,或通过标志位拦截重复请求。
- 添加请求状态标记:在Activity中维护布尔变量标记请求状态,发起前检查,回调完成后重置:
private boolean isPermissionRequestInProgress = false; private void requestRecordAudioPermission() { if (isPermissionRequestInProgress) { return; } isPermissionRequestInProgress = true; Dexter.withActivity(MainActivity.this) .withPermission(android.Manifest.permission.RECORD_AUDIO) .withListener(new PermissionListener() { @Override public void onPermissionGranted(PermissionGrantedResponse response) { isPermissionRequestInProgress = false; showSpeechSheetDialog(); } @Override public void onPermissionDenied(PermissionDeniedResponse response) { isPermissionRequestInProgress = false; if (response.isPermanentlyDenied()) { // 原有弹窗逻辑 } } @Override public void onPermissionRationaleShouldBeShown(PermissionRequest request, PermissionToken token) { token.continuePermissionRequest(); } }) .withErrorListener(error -> { isPermissionRequestInProgress = false; Log.e("Dexter error", error.toString()); }) .check(); } - 规避生命周期冲突:避免在
onResume这类重复执行的生命周期方法中直接调用权限申请,或添加判断逻辑确保仅在必要时发起请求。 - 确认Dexter初始化:v6.x版本无需手动初始化,若有自定义配置,确保初始化代码仅执行一次(如在Application类中)。
内容的提问来源于stack exchange,提问作者Surya Pratap Raj
相关产品推荐
相关产品推荐

