问题由来
公司有项目需要使用手机蓝牙配对蓝牙模块,但是在写代码调试中,发现无法搜索到蓝牙模块(有时可以搜索到),问题找了很长时间,确定没有代码上的问题,然后换了个华为低端手机,发现可以搜索到,证实了我的想法,所以问题肯定是小米手机,询问了从事安卓开发的同事,得知这是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(传送门),很好用,效果就是需要新权限时,弹出对话框提醒用户给予权限。
本文为原创文章,转载请注明出处: https://www.liuguogy.com/archives/android-6-cannot-find-devices.html