You need to enable JavaScript to run this app. Kotlin Android运行时申请定位权限未触发onRequestPermissionsResult问题
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin Android运行时申请定位权限未触发onRequestPermissionsResult问题

代码问题分析

1 致命核心问题:权限申请前Activity被主动销毁

你在onCreate方法的最后一行直接调用了finish(),执行完checkLocationPermission()发起权限申请弹窗的同时,当前Activity会被直接销毁,系统找不到接收权限申请结果的实例,自然不会触发onRequestPermissionsResult回调,所有后续BLE相关逻辑也没有运行载体。

2 缺少Android 12+ BLE专属运行时权限

Android 12(API等级31)开始,BLE相关功能不再仅依赖位置权限,新增了三个危险权限需要动态申请:

  • BLUETOOTH_SCAN:用于BLE设备扫描
  • BLUETOOTH_ADVERTISE:用于BLE广播发送
  • BLUETOOTH_CONNECT:用于BLE设备连接
    如果你的应用目标SDK版本>=31,只申请位置权限无法正常使用BLE功能。

3 位置请求参数配置错误

LocationRequest的时间参数单位是毫秒,你当前配置的interval = 30、fastestInterval = 10、maxWaitTime= 60意味着每30毫秒请求一次位置,该配置会导致极高耗电,且完全没有必要,正常BLE场景下间隔配置为几秒即可。

4 非必要申请后台位置权限

如果你的应用不需要在后台运行时扫描BLE设备,不需要申请ACCESS_BACKGROUND_LOCATION权限,该权限申请门槛更高,用户拒绝概率也更高,反而会影响正常授权。

修复方案
  1. 删除onCreate方法最后一行的finish()调用,保证Activity在权限申请周期内保持活跃。
  2. 适配Android 12+ BLE权限:
    • 先在AndroidManifest.xml中声明对应权限,可根据使用场景补充usesPermissionFlags配置
    • 在权限申请逻辑中新增对应BLE权限的动态申请判断
  3. 调整LocationRequest的时间参数,参考配置如下:
private val locationRequest: LocationRequest =  LocationRequest.create().apply {
    interval = 30000 // 30秒
    fastestInterval = 10000 // 10秒
    priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
    maxWaitTime= 60000 // 60秒
}
  1. 如无后台BLE扫描需求,移除ACCESS_BACKGROUND_LOCATION的申请逻辑。

内容的提问来源于stack exchange,提问作者Joseph Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 10:27:00