You need to enable JavaScript to run this app. Android Java申请位置权限出现单次仅能请求一组权限警告如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Android Java申请位置权限出现单次仅能请求一组权限警告如何解决

问题根因

  • 连续两次调用ActivityCompat.requestPermissions():Android 系统限制同一时间只能处理一组权限请求,连续发起两次请求就会触发Can request only one set of permissions at a time警告
  • 权限请求放在while循环中:权限请求是异步操作,循环会在用户操作前重复发起请求,导致无限弹窗和报错

修复方案

  1. 合并权限请求:将需要申请的多个权限放入同一个字符串数组,只调用一次请求方法
  2. 移除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,提问作者Хлопов Артем

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 08:54:05