You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
注册

Android扫描蓝牙设备是否需ACCESS_FINE_LOCATION权限?权限疑问求解

问题解答

蓝牙与定位权限绑定的核心原因

Android系统将蓝牙扫描与定位权限挂钩,源于早期蓝牙设备的MAC地址可被第三方通过周边蓝牙信标数据库反向推导用户物理位置,Google为保护用户隐私,从Android 6.0开始将蓝牙扫描权限纳入定位权限管控范畴。

为什么ACCESS_COARSE_LOCATION无效,只有ACCESS_FINE_LOCATION可行?

这取决于你的应用目标SDK版本和运行的Android系统版本:

  • Android 10-11(API 29-30):系统强制要求蓝牙扫描必须使用ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION不再生效,属于该版本的硬性限制。
  • Android 6-9(API 23-28):若ACCESS_COARSE_LOCATION无效,大概率是你使用了旧版蓝牙扫描API(比如BluetoothAdapter.startDiscovery()),部分厂商对这类API要求更严格的定位权限;也可能是Manifest权限声明有误。
  • Android 12+(API 31+):若你仍在请求定位权限,说明未正确使用新的蓝牙权限体系——该版本新增了独立蓝牙权限,无需依赖定位权限。

解决方案

针对Android 12+(API 31+)(推荐)

  1. AndroidManifest.xml中声明新蓝牙权限,并给BLUETOOTH_SCAN添加非定位标记:
<!-- 蓝牙扫描权限,标记为非定位用途 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
    android:usesPermissionFlags="neverForLocation" />
<!-- 蓝牙连接权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- 适配旧版本的蓝牙管理权限(可选,若需管理蓝牙状态) -->
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
    android:maxSdkVersion="30" />
<!-- 声明支持BLE(若应用针对BLE设备) -->
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
  1. 代码中仅请求BLUETOOTH_SCANBLUETOOTH_CONNECT权限即可,无需请求定位权限。

针对Android 10-11(API 29-30)

无法绕开ACCESS_FINE_LOCATION权限,只能优化用户体验:

  • 请求权限前,用弹窗或引导页明确告知用户:「本应用需要精确定位权限仅用于识别蓝牙设备,不会收集或追踪你的位置信息」。
  • 若用户拒绝权限,蓝牙扫描失败时给出清晰提示:「无法识别蓝牙设备,请前往应用设置开启精确定位权限」。

针对Android 6-9(API 23-28)

检查Manifest是否正确声明ACCESS_COARSE_LOCATION,同时尝试切换到BluetoothLeScanner这类现代扫描API,部分设备对旧API的权限要求更严格。

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

火山引擎 最新活动