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
相关产品推荐
相关产品推荐

