Android配网设备和定位权限的拉扯
Posted: 2024年 Dec 9日 10:55
哪些设备或者场景会需要定位权限呢?
- 扫描附近的蓝牙设备。在平时想使用app配网蓝牙设备时,需要先发现蓝牙设备,这个“发现”就需要提前授予定位权限。
- 获取当前连接的wifi信息。在配网app设备时,无论纯wifi设备还是蓝牙双模设备,在输入wifi页面中,想自动填充wifi名称,那就需要授予定位权限。
那对定位权限很敏感就是不想授予定位权限,有没有解决相关解决办法呢?
先说结论,有,但不完全有。
扫描附近的蓝牙设备
在Android12之前,蓝牙扫描附近的设备以及扫描附近的wifi网络和定位权限强绑定,这是Android官方的要求,所以这种场景下无法在不授予定位权限的情况下扫描附近的蓝牙设备。
但从Android12开始,Google官方将扫描附近的蓝牙设备功能和定位权限进行了剥离,所以在Android12上扫描附近设备时,无需申请定位权限。当下仅Beacon设备控制需要耦合定位权限。
具体要如何操作呢?
Code: Select all
<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_ADVERTISE"/>
在Android12及以上,清单文件中加入对应新增蓝牙权限声明即可正常扫到绝大部分蓝牙设备。
请注意
android:usesPermissionFlags="neverForLocation"
是必须添加的,若不加此flag,那在启动系统蓝牙扫描后,是无任何具体蓝牙扫描回调。
为什么说绝大部分呢?因为加入了此flag后,苹果iBeacon和谷歌iBeacon设备会扫描不到,会过滤掉这两类设备的蓝牙广播包。所以,如果app无需iBeacon类型设备,则可使用该方案,无需申请定位相关权限。
获取当前连接的wifi信息
Google官方将扫描附近的wifi网络功能和定位权限也进行了剥离,获取wifi名称也可以不需要定位权限。
所以,若你的app满足条件,
- 不需要对应iBeacon类设备;
- 无需获取wifi或者说需要获取WiFi 或者 Android版本满足大于等于13;
也可以去掉定位权限以减轻用户疑问。