Target SDK 22下权限申请弹窗问题及grantResults为空原因咨询
嘿,我来帮你逐个理清Target SDK 22下的这些权限问题,都是实际开发中容易踩的坑,分享下我的经验:
Target SDK 22 权限相关问题全解答
1. 用户从设置关闭权限后,如何触发权限申请提示?
Target SDK 22属于Android 6.0(API 23)之前的版本,原生系统里权限是安装时一次性授予的,没有运行时动态申请的机制。但如果用户在定制ROM的设置里手动关闭了权限,你没法调用API 23才有的requestPermissions()弹出系统权限弹窗,只能这么处理:
- 先通过
ContextCompat.checkSelfPermission()(兼容库方法,适配全版本)检查权限状态 - 发现权限被拒绝时,弹出自定义弹窗告知用户这个权限的作用,然后引导用户跳转到应用设置页面手动开启,代码示例:
// 跳转应用设置页面 Intent settingsIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri packageUri = Uri.fromParts("package", getPackageName(), null); settingsIntent.setData(packageUri); startActivityForResult(settingsIntent, 1001); // 自定义请求码
等用户从设置返回后,再重新检查权限状态即可。
2. 能否用代码直接关闭设置中的权限?
完全不行,Android系统从设计上就禁止应用通过代码修改自身的权限状态——权限的开启/关闭是用户的专属操作,应用只能引导用户前往设置页面,无法替用户完成这个动作,不管Target SDK版本是多少都一样。
3. requestPermission调用后,onRequestPermissionsResult中grantResults长度为0的原因
因为requestPermissions()是Android 6.0(API 23)才新增的API,当你的Target SDK设为22时,系统会认为你的应用不支持动态权限机制,调用这个方法后系统不会做任何处理,自然不会返回有效的授权结果,就会出现grantResults为空数组的情况。
4. Target SDK 22下真的无法显示系统权限弹窗吗?
对的,动态权限申请弹窗是API 23才引入的特性。Target SDK 22的应用,在Android 6.0及以上设备上,系统会默认授予所有清单中声明的权限(除非用户手动去设置关闭),但应用无法通过requestPermissions()触发系统的权限申请弹窗。如果要让用户重新授权,只能走引导到设置页面的路子。
内容的提问来源于stack exchange,提问作者Gaurav Arora
相关产品推荐
相关产品推荐

