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

startActivityForResult跳转ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS报错咨询

问题根源
  • 核心原因是Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS 这个系统Intent的官方设计不支持携带package:协议的Uri参数。和你正常运行的ACTION_MANAGE_WRITE_SETTINGS不同,后者专门做了单应用跳转适配,支持传入包名Uri直接定位到对应应用的权限页,但通知策略访问权限(勿扰权限)的全局列表页Intent没有配置对应的路由匹配规则,你传入包名Uri后系统找不到同时匹配该action和数据的Activity,就会抛出ActivityNotFoundException。
  • 你给出的异常代码还存在语法错误:startActivityForResult方法要求第二个参数为请求码,你错误将Uri.parse逻辑放到了方法的第二个参数位置,同时存在括号匹配错误,本身就会触发编译问题。
解决方案

如果需要直接跳转到当前应用的勿扰权限设置页,无需展示所有应用列表,Android 8.0(API 26)及以上系统提供了专门的适配action Settings.ACTION_NOTIFICATION_POLICY_ACCESS_GRANT_SETTINGS,该action支持携带包名Uri参数,可直接跳转至单应用设置页,示例代码如下:

when {
    Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> {
        val intent = Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_GRANT_SETTINGS).apply {
            data = Uri.parse("package:$packageName")
        }
        // 调用前先做解析判断,避免极端场景崩溃
        if (intent.resolveActivity(packageManager) != null) {
            startActivityForResult(intent, 55)
        } else {
            // 异常降级逻辑,比如提示用户手动进入设置页开启权限
        }
    }
    else -> {
        // 8.0以下系统无单应用跳转适配,只能跳转全局列表页
        val intent = Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS)
        if (intent.resolveActivity(packageManager) != null) {
            startActivityForResult(intent, 55)
        }
    }
}
  • 若你的应用最低兼容版本低于API 26,8.0以下没有官方单应用跳转方案,只能使用全局列表页作为降级方案。
  • 建议所有隐式Intent调用前都添加resolveActivity判断,避免因系统定制等原因导致的崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:54:04