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权限,该权限申请门槛更高,用户拒绝概率也更高,反而会影响正常授权。
修复方案
- 删除
onCreate方法最后一行的finish()调用,保证Activity在权限申请周期内保持活跃。 - 适配Android 12+ BLE权限:
- 先在AndroidManifest.xml中声明对应权限,可根据使用场景补充
usesPermissionFlags配置 - 在权限申请逻辑中新增对应BLE权限的动态申请判断
- 先在AndroidManifest.xml中声明对应权限,可根据使用场景补充
- 调整LocationRequest的时间参数,参考配置如下:
private val locationRequest: LocationRequest = LocationRequest.create().apply { interval = 30000 // 30秒 fastestInterval = 10000 // 10秒 priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY maxWaitTime= 60000 // 60秒 }
- 如无后台BLE扫描需求,移除
ACCESS_BACKGROUND_LOCATION的申请逻辑。
内容的提问来源于stack exchange,提问作者Joseph Kim
相关产品推荐
相关产品推荐

