You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适配Android 13时使用ActivityResult获取权限始终返回0问题排查

问题分析与解决方案

你遇到的result.getResultCode()始终返回0的原因是:Settings.ACTION_MANAGE_OVERLAY_PERMISSION对应的系统设置页面,无论用户是否授予权限,都会返回RESULT_CANCELED(值为0)。这类系统设置界面不会主动返回RESULT_OK,所以通过结果码判断权限状态的思路本身就不成立。

旧代码里也没有依赖resultCode,而是在onActivityResult中直接重新检查权限状态,新的ActivityResult机制下也需要遵循同样的逻辑。

修正后的代码

// 建议在Activity的onCreate方法中完成注册
ActivityResultLauncher<Intent> activityResultLaunch = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        result -> {
            // 忽略resultCode,直接重新检查权限状态
            if (Settings.canDrawOverlays(this)) {
                // 权限已授予,执行后续业务逻辑
            } else {
                // 权限未授予,执行提示与收尾操作
                errorToastDrawOverOtherApp();
                finish();
            }
        });

// 悬浮窗权限请求逻辑
if (!Settings.canDrawOverlays(this)) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
            Uri.parse("package:" + getPackageName()));
    activityResultLaunch.launch(intent);
}

关键说明

  • 针对系统权限设置类页面(如悬浮窗、通知权限、定位权限设置页等),不要依赖resultCode判断操作结果,必须主动调用权限检查API确认最终状态。
  • registerForActivityResult需在Activity的生命周期早期(如onCreate)完成注册,避免重复注册或生命周期不匹配导致的异常。

内容的提问来源于stack exchange,提问作者zaxunobi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:43:18