API23的ZUK Z2设备调用WRITE_SETTINGS权限时崩溃求助
解决ZUK Z2(API 23)上ACTION_MANAGE_WRITE_SETTINGS Intent崩溃问题
这个问题我之前帮同事排查过,ZUK的定制ROM在Android 6.0(API23)上确实对系统设置页面做了裁剪,移除了原生的ACTION_MANAGE_WRITE_SETTINGS对应的Activity,导致你的Intent找不到可处理的组件,而三星等品牌的API23设备保留了这个原生页面,所以没出现崩溃。下面是两个可行的解决思路:
1. 先判断Intent是否可被处理,避免崩溃(核心方案)
在调用startActivity()之前,先用resolveActivity()检查系统是否有能处理该Intent的Activity,如果没有就做降级处理——跳转到应用详情页,引导用户手动开启权限。
修改后的代码如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Settings.System.canWrite(ListOfTerminalsActivity.this)) { // 执行你的业务逻辑 } else { Intent writeSettingsIntent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); writeSettingsIntent.setData(Uri.parse("package:" + getPackageName())); writeSettingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 关键:先判断Intent是否有对应的处理Activity if (writeSettingsIntent.resolveActivity(getPackageManager()) != null) { startActivity(writeSettingsIntent); } else { // 降级处理:跳转到应用详情页 Intent appDetailsIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); appDetailsIntent.setData(Uri.fromParts("package", getPackageName(), null)); appDetailsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(appDetailsIntent); // 给用户明确的操作提示 Toast.makeText(this, "请在应用详情页的「权限」选项中,开启「修改系统设置」权限", Toast.LENGTH_LONG).show(); } } }
2. 针对ZUK设备的特殊适配(可选补充)
如果想更精准适配ZUK设备,可以通过Build.MANUFACTURER判断品牌,给出更针对性的提示,不过这个不是必须的,因为上面的降级方案已经能覆盖所有情况:
String deviceBrand = Build.MANUFACTURER.toLowerCase(); if (deviceBrand.contains("zuk")) { Toast.makeText(this, "请前往设置→应用管理→你的应用→权限管理→特殊权限,开启修改系统设置权限", Toast.LENGTH_LONG).show(); }
为什么只有ZUK出问题?
ZUK在定制Android 6.0时,可能出于系统精简或权限逻辑调整的目的,移除了原生的MANAGE_WRITE_SETTINGS设置页面,而其他品牌(比如三星)的ROM保留了这个原生组件,所以你的代码在那些设备上能正常运行。
内容的提问来源于stack exchange,提问作者Kkk.
相关产品推荐
相关产品推荐

