在Android 6.0上需要启用蓝牙低能耗扫描的位置

升级到Android版本6.0后,只有在设备上启用位置服务的情况下,蓝牙低功耗(BLE)扫描才能工作。 请参阅此处以供参考: Android 6.0上的Bluetooth Low Energy startScan无法find设备

基本上,您需要为应用程序以及电话启用权限。 这是一个错误? 有没有实际启用的位置服务可以扫描? 我不想有所有我的应用程序的位置。

编辑我没有提到,我在API 21中提供的BluetoothLeScanner使用startScan()方法。我没有与该方法需要清单中的课程和罚款位置权限。 我只是不希望我的应用程序的用户必须在他们的设备(GPS等)上启用位置服务才能使用我的应用程序。

之前, startScan()方法将运行并返回结果,并在手机上禁用定位服务。 然而,在棉花糖,同样的应用程序将“扫描”,但沉默失败,没有结果时,位置服务没有启用电话和课程/罚款位置权限仍然在清单中没有结果。

不,这不是一个错误。

这个问题被提到谷歌,他们回答说,这是预期的行为,他们不会解决这个问题。 他们指示开发人员访问该网站 ,指出硬件标识符访问现在需要位置权限。 现在开发者有责任让用户意识到这个需求。

然而,在这个问题上,它没有解释为什么需要定位服务(GPS等),似乎他们将不会重新解释这个问题来解释这个问题,因为它已经被标记为预期的行为。

回答问题的第二部分:是的,可以在不启用定位服务的情况下进行扫描。 您可以使用BluetoothAdapter.getDefaultAdapter().startDiscovery()进行蓝牙经典扫描,并且可以使用位置服务。 这将发现所有蓝牙设备,BLE和其他。 但是,如果将BLE设备视为startScan()的结果,则不会有扫描logging。

我通过在gradle文件中将targetSdkVersion设置为22来解决这个问题。 您必须在清单中声明ACCESS_COARSE_LOCATION ,但即使用户拒绝来自“应用程序设置”的此权限,BLE扫描也将起作用。

我发现,在Android 6之后,您必须授予ACCESS_COARSE_LOCATION权限。 但是在某些设备上,您的手机定位服务(GPS)也是必要的,因此您可以发现外围设备。 我发现使用Nexus 5x,与Android 7.0。

您可以使用BluetoothAdapter.startDiscovery()
它将扫描Bluetooth Smart和传统蓝牙设备,但不需要启用位置服务。
(您仍然需要Android 6上的ACCESS_COARSE_LOCATION权限。)

编辑:
您可以在find的设备上调用BluetoothDevice.getType来过滤Bluetooth Smart / Low Energy设备。

那么,我已经看了我在Eclipse中编写的代码,并使用startScan(API 21)函数没有声明清单文件中的位置的东西。 我仍然得到适当的callback。 您是否尝试过运行没有位置声明的代码? 另一方面,您可以使用不需要这些权限的已过时的startLeScan(API 18)。 然而,在我看来,使用API​​ 18的方法在服务中search和阅读所需的特性更为复杂。

我也试过这个清单,但没有要求许可,不知道为什么。 您的应用在启动时是否提示位置权限? 如果不是,我们需要在运行时请求权限 。

你也可以检查这个testing,如果你的应用程序工作正常:

打开设置>应用程序> YourApplication>权限并启用位置,然后尝试扫描结果。

只有在清单上提供了ACCESS_COARSE_LOCATION的情况下,此处才会列出。