You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android运行时权限异常:重写onRequestPermissionsResult后仍报错

Android权限授权后仍报错的原因及解决办法

嘿,我遇到过类似的权限坑,来帮你捋清楚问题出在哪以及怎么解决!你收到的这个错误提示,本质是系统或Lint静态检查认为你没有在执行需要权限的代码前显式确认权限状态——哪怕你已经处理了授权回调,也可能因为逻辑漏洞或时机问题触发这个警告。

可能的原因

  • 权限检查逻辑有漏洞:比如你只在onRequestPermissionsResult里调用startLocationUpdates,但没有在startLocationUpdates内部再次做权限检查。系统权限状态可能存在短暂不同步,或者后续再次调用该方法时没做校验。
  • onRequestPermissionsResult判断错误:比如申请了多个权限,但只判断了单个权限是否授予;或者数组索引写错,导致误判权限已通过。
  • Lint静态检查误报:有时候你的权限检查逻辑没问题,但代码结构让Lint识别不到(比如检查和权限代码之间有其他分支逻辑),导致误触发警告。

具体解决办法

1. 在需要权限的方法内部强制做权限检查

不管什么时候调用startLocationUpdates,都要在方法开头先确认权限状态,这是最稳妥的做法:

private fun startLocationUpdates() {
    // 根据你的需求调整要检查的权限
    val hasFineLocation = ActivityCompat.checkSelfPermission(
        this,
        Manifest.permission.ACCESS_FINE_LOCATION
    ) == PackageManager.PERMISSION_GRANTED
    val hasCoarseLocation = ActivityCompat.checkSelfPermission(
        this,
        Manifest.permission.ACCESS_COARSE_LOCATION
    ) == PackageManager.PERMISSION_GRANTED

    if (hasFineLocation && hasCoarseLocation) {
        // 权限确认通过,执行定位更新逻辑
        locationManager.requestLocationUpdates(...)
    } else {
        // 权限缺失,再次申请或提示用户去设置开启
        ActivityCompat.requestPermissions(
            this,
            arrayOf(
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.ACCESS_COARSE_LOCATION
            ),
            LOCATION_PERMISSION_REQUEST_CODE // 自定义请求码
        )
    }
}

2. 修正onRequestPermissionsResult的处理逻辑

确保正确判断所有申请的权限都被授予,避免误判:

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) {
        // 检查所有申请的权限是否都通过
        val allGranted = grantResults.all { it == PackageManager.PERMISSION_GRANTED }
        if (allGranted) {
            startLocationUpdates()
        } else {
            Toast.makeText(this, "定位权限未开启,无法获取位置信息", Toast.LENGTH_SHORT).show()
        }
    }
}

3. 处理Lint误报(最后手段)

如果确认权限检查逻辑完全正确,但Lint仍报错,可以在方法上添加注解抑制警告,但不推荐优先使用:

@SuppressLint("MissingPermission")
private fun startLocationUpdates() {
    // 你的定位逻辑代码
}

4. 检查权限申请与检查的一致性

确保你申请的权限数组和检查的权限完全对应,比如申请了ACCESS_FINE_LOCATION,就不要只检查ACCESS_COARSE_LOCATION,避免漏检。

内容的提问来源于stack exchange,提问作者Osama Mohammed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:21:37