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

问题描述 投票:79回答:7

升级到Android版本6.0后,只有在设备上启用了位置服务时,蓝牙低功耗(BLE)扫描才有效。请参阅此处以供参考:Bluetooth Low Energy startScan on Android 6.0 does not find devices

基本上,您需要为应用程序以及手机启用权限。这是一个错误吗?是否可以在没有实际启用位置服务的情况下扫描?我不想拥有所有应用的位置。

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

以前,startScan()方法将在手机上禁用位置服务的情况下运行并返回结果。但是,在Marshmallow上,相同的应用程序将“扫描”但是静默失败并且在手机上未启用位置服务且课程/精确位置权限仍在清单中时未返回任何结果。

android bluetooth bluetooth-lowenergy android-6.0-marshmallow
7个回答
66
投票

不,这不是一个错误。

这个issue被带到谷歌,他们回应说这是预期的行为,他们不会修复它。他们指示开发人员访问this site,指出现在需要位置权限才能访问硬件标识符。现在,开发人员有责任让用户了解该要求。

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

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


10
投票

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

这只是一个避免请求位置许可的黑客行为。最好定位最新的Android版本。


8
投票

我发现在Android 6之后你必须授予ACCESS_COARSE_LOCATION权限。但在某些设备上还需要打开手机定位服务(GPS),以便发现外围设备。我发现使用Nexus 5x和Android 7.0。


2
投票

我也在清单上试过这个,但没有请求许可,不知道为什么。你是应用程序在启动时提示输入位置权限吗?如果不是,我们需要request for permission on runtime

此外,您可以检查此项以测试您的应用是否正常运行:

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

只有在清单上提供了ACCESS_COARSE_LOCATION时,才会在此处列出位置。


2
投票

你可以使用BluetoothAdapter.startDiscovery()。 它将扫描蓝牙智能和经典蓝牙设备,但不需要启用位置服务。 (你仍然需要Android 6上的ACCESS_COARSE_LOCATION权限。)

您可以在找到的设备上调用BluetoothDevice.getType来过滤蓝牙智能/低功耗设备。


0
投票

好吧,我查看了我在Eclipse中编写的代码,并在那里使用了startScan(API 21)函数,而没有在清单文件中声明位置内容。我仍然得到适当的回调。您是否尝试过在没有位置声明的情况下运行代码?另一方面 - 您可以使用不需要这些权限的已弃用的startLeScan(API 18)。但是,在我看来,使用API​​ 18方法搜索和阅读服务中所需的特性更加复杂。


0
投票

从我最近在Android 8.0上注意到的,不需要打开你的GPS进行BLE扫描,但是你必须在清单中声明它,但是用户必须允许该权限。

当您尝试使用startScan()方法进行扫描时,Android将提示用户允许位置权限。如果不允许,您的扫描将失败。

© www.soinside.com 2019 - 2024. All rights reserved.