我有一个使用蓝牙并连接到设备的应用程序,无法使用BluetoothAdapter.getDefaultAdapter()找到任何设备.startDiscovery();它在发现之前工作得很好。尝试过其他应用程序,它也不适用于其他应用程序。但我尝试配对的设备(Arduino bt-module)可以在Android设置中找到。知道我该怎么办?我实现了http://developer.android.com/guide/topics/connectivity/bluetooth.html所描述的所有内容,并且在更新之前就已经有效了。
答案 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)。
仅仅在清单文件中添加权限是不够的,因为权限属于"危险"保护水平。 需要用户同意才能在运行时请求权限。
在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" />