由于棉花糖使用BluetoothAdapter.getDefaultAdapter()更新蓝牙发现.startDiscovery();被打破

时间:2015-10-10 10:12:36

标签: android bluetooth android-6.0-marshmallow

我有一个使用蓝牙并连接到设备的应用程序,无法使用BluetoothAdapter.getDefaultAdapter()找到任何设备.startDiscovery();它在发现之前工作得很好。尝试过其他应用程序,它也不适用于其他应用程序。但我尝试配对的设备(Arduino bt-module)可以在Android设置中找到。知道我该怎么办?我实现了http://developer.android.com/guide/topics/connectivity/bluetooth.html所描述的所有内容,并且在更新之前就已经有效了。

3 个答案:

答案 0 :(得分:31)

蓝牙适配器已在Android 6.0中进行了更改

您需要设置权限ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION权限并需要使用  BluetoothLeScanner.startScan()方法开始扫描。

以下是更改日志的说明:

为了向用户提供更好的数据保护,在Android 6.0中,Android删除了使用Wi-Fi和蓝牙API对应用程序的设备本地硬件标识符的编程访问。 WifiInfo.getMacAddress()和BluetoothAdapter.getAddress()方法现在返回一个常量值02:00:00:00:00:00。

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

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

注意:当运行Android 6.0(API级别23)的设备启动后台Wi-Fi或蓝牙扫描时,外部设备可以看到该操作来自随机MAC地址。

您可以从此链接获取更多详细信息: 的 http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html

答案 1 :(得分:5)

只需在设置中启用位置即可,效果很好!!

答案 2 :(得分:2)

从API级别23开始,蓝牙发现也需要位置访问权限(ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION)。

  

https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id

仅仅在清单文件中添加权限是不够的,因为权限属于"危险"保护水平。 需要用户同意才能在运行时请求权限。

在AndroidManifest.xml中添加了权限:

print(None)

在运行时请求ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION:

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

有关权限的更多细节: https://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en