Android Java申请位置权限出现单次仅能请求一组权限警告如何解决
问题根因
- 连续两次调用
ActivityCompat.requestPermissions():Android 系统限制同一时间只能处理一组权限请求,连续发起两次请求就会触发Can request only one set of permissions at a time警告 - 权限请求放在while循环中:权限请求是异步操作,循环会在用户操作前重复发起请求,导致无限弹窗和报错
修复方案
- 合并权限请求:将需要申请的多个权限放入同一个字符串数组,只调用一次请求方法
- 移除while死循环:通过系统权限申请回调处理权限授予结果,不要用同步循环等待异步操作结果
修复后代码示例
权限申请逻辑
// 先判断是否已经获取所需权限 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // 两个权限放在同一个数组里一次申请 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1); } else { // 已经有权限,执行后续定位相关业务逻辑 doLocationWork(); }
权限申请结果回调
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1) { // 判断两个权限是否都被授予 if (grantResults.length > 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) { // 权限已授予,执行定位逻辑 doLocationWork(); } else { // 权限被拒绝,可以给用户提示权限必要性,或者关闭相关功能 Toast.makeText(this, "需要定位权限才能使用该功能", Toast.LENGTH_SHORT).show(); } } }
内容的提问来源于stack exchange,提问作者Хлопов Артем
相关产品推荐
相关产品推荐

