MENU

Android 6.0 蓝牙 找不到设备问题

November 5, 2017 • Read: 3404 • 技术

问题由来

公司有项目需要使用手机蓝牙配对蓝牙模块,但是在写代码调试中,发现无法搜索到蓝牙模块(有时可以搜索到),问题找了很长时间,确定没有代码上的问题,然后换了个华为低端手机,发现可以搜索到,证实了我的想法,所以问题肯定是小米手机,询问了从事安卓开发的同事,得知这是Android 6.0的新特性。
查找谷歌文档 Android 6.0 Changes,定位到硬件标识符访问权部分,如下:

为给用户提供更严格的数据保护,从此版本开始,对于使用 WLAN API 和 Bluetooth API 的应用,Android 移除了对设备本地硬件标识符的编程访问权。WifiInfo.getMacAddress() 方法和 BluetoothAdapter.getAddress() 方法现在会返回常量值 02:00:00:00:00:00。

现在,要通过蓝牙和 WLAN 扫描访问附近外部设备的硬件标识符,您的应用必须拥有 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限。

WifiManager.getScanResults()
BluetoothDevice.ACTION_FOUND
BluetoothLeScanner.startScan()

注:当运行 Android 6.0(API 级别 23)的设备发起后台 WLAN 或蓝牙扫描时,在外部设备看来,该操作的发起来源是一个随机化 MAC 地址。

注意到其中的使用蓝牙和WLAN扫描设备时,应用必须拥有 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限,因为是,所以只需要在Manifest文件中添加权限

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

或者

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

或者两个都加,省得以后谷歌再变,完美~

总结

手机:小米
系统:Android 6.0
问题:搜索不到蓝牙设备
原因:Android 6.0 蓝牙权限需要定位权限
解决:添加权限<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

顺便,安利GitHub上的一个弹出申请权限对话框的API——Grant(传送门),很好用,效果就是需要新权限时,弹出对话框提醒用户给予权限。

Last Modified: December 5, 2017