targetSDK=30下Android10/11 BLE扫描与后台定位权限适配问题
问题解答
1 为什么Android 10(API 29)未出现Android 11(API 30)的异常行为
这是Android系统不同版本对BLE扫描的权限校验规则差异导致的:
- API 29 仅当应用明确在后台发起BLE扫描时,才会校验
ACCESS_BACKGROUND_LOCATION权限。只要应用持有ACCESS_FINE_LOCATION权限,无论清单是否声明后台定位权限,前台扫描、通过BroadcastReceiver接收扫描结果的异步扫描模式都不会被系统拦截,你遇到的Android 10上全场景正常的表现符合该版本逻辑。 - API 30 对异步BLE扫描的校验逻辑做了收严:只要你使用PendingIntent的方式注册扫描回调(也就是你通过
BroadcastReceiver接收扫描结果的实现方式),不管应用当前处于前台还是后台,系统都会先校验应用是否在AndroidManifest.xml中声明了ACCESS_BACKGROUND_LOCATION权限,未声明的话直接拦截所有扫描结果,这就是你Android 11设备上扫描异常的根本原因。
2 为什么仅授予前台权限也能正常工作,仍需要声明ACCESS_BACKGROUND_LOCATION权限
权限声明和授权是两个独立的校验环节:
- 首先
ACCESS_BACKGROUND_LOCATION的清单声明是API 30+下使用异步PendingIntent扫描模式的准入门槛:系统在你注册扫描的时候就会先查清单有没有这个权限声明,没有的话直接驳回你的扫描请求,和后续用户给不给授权没有关系。 - 你按照流程申请该权限后,即使用户只选择授予前台定位权限,也能正常使用扫描的原因是:实际运行时的权限校验只要求你持有对应场景的权限即可,前台扫描只需要前台定位权限,不需要用户授予「始终允许」的后台权限。
- 该权限声明会影响前台扫描的原因就是你用了
BroadcastReceiver的异步回调扫描模式,系统对这种模式的校验优先级高于前后台场景判断,只要用了该模式就必须先有后台定位权限的清单声明,所以哪怕你应用在前台运行,没声明该权限也会被拦截。
内容的提问来源于stack exchange,提问作者Zach Dean
相关产品推荐
相关产品推荐

