使用registerForActivityResult检查ACTION_MANAGE_OVERLAY_PERMISSION时Toast不显示问题
问题原因
ACTION_MANAGE_OVERLAY_PERMISSION对应的系统悬浮窗权限设置页,无论用户是否授予权限,返回的resultCode固定为Activity.RESULT_CANCELED,你代码中判断result.getResultCode() == Activity.RESULT_OK的分支永远无法命中,所以Toast不会弹出。
修复方案
无需判断返回的resultCode,直接在回调中调用Settings.canDrawOverlays()方法主动校验悬浮窗权限状态即可,同时建议启动Intent时传入当前应用包名,可直接跳转到对应应用的悬浮窗权限设置页,优化用户操作路径:
权限声明(AndroidManifest.xml)
<!-- 需提前声明悬浮窗权限 --> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
修正后的业务代码
// 注册ActivityResultLauncher ActivityResultLauncher<Intent> mStartForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { // 主动校验悬浮窗权限是否已授予 if (Settings.canDrawOverlays(MainActivity.this)) { Toast.makeText(MainActivity.this,"Ok",Toast.LENGTH_SHORT).show(); // 权限授予后的后续业务逻辑写在此处 } } }); // 启动悬浮窗权限设置页 Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); // 传入当前应用包名,直接跳转对应应用的权限设置项 intent.setData(Uri.parse("package:" + getPackageName())); mStartForResult.launch(intent);
内容的提问来源于stack exchange,提问作者dani
相关产品推荐
相关产品推荐

