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

V-P*_*PTR 83 android bluetooth bluetooth-lowenergy android-6.0-marshmallow

升级到Android版本6.0后,只有在设备上启用了位置服务时,蓝牙低功耗(BLE)扫描才有效.请参阅此处以供参考:Android 6.0上的蓝牙低功耗startScan无法找到设备

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

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

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

V-P*_*PTR 70

不,这不是一个错误.

这个问题提交给谷歌,他们回答说这是预期的行为,他们不会修复它.他们指示开发人员访问此站点,指出现在需要位置权限才能访问硬件标识符.现在,开发人员有责任让用户了解该要求.

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

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

  • 这不是一个真正的错误 - 如果恶意应用程序开发人员可以扫描已知的蓝牙信标,那么他们可以通过询问位置权限来确定您的位置而不会引起用户的怀疑.因此,不幸的是,要求BLE访问必须与要求您的粗略位置相同. (12认同)
  • 这难以置信。当然,如果谷歌担心 BLE 扫描被用来推断位置,他们应该为此添加单独的许可,而不是强迫用户允许 GPS 访问,把孩子和洗澡水一起倒掉! (11认同)
  • @Pierre-LucPaour 强制打开 GPS 意味着其他实际使用定位服务的应用程序可以在幕后“合法”使用它。用户手动关闭 GPS 的原因之一是为了防止应用程序定期使用它并耗尽电池,强制 GPS 搜索蓝牙是让用户知道其位置可能被使用的最违反直觉的方式。 (7认同)
  • 谷歌声称它不是一个错误让我感到冷淡.他们的态度很普通. (4认同)
  • startDiscovery 方法需要在我的 Android 10 手机上打开 GPS。这是一个错误,因为“位置权限”!=“GPS 打开”。StartDiscovery 需要“位置许可”,这是可以的,但为什么当我获得许可时,我仍然收到错误,直到用户实际打开 GPS 定位?这是一个错误。 (4认同)
  • 让我看看我是否直率。BLE的最大优势是“ LE”位,即低能耗,这意味着电池电量消耗减少。当然,要获得这些节省,我必须打开GPS(这是一种已知的电池消耗),从而抵消了我可能因使用BLE而节省的电量。/ me难以置信地摇了摇头。 (3认同)
  • @orionelenzil"您必须声明的其他权限是ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION.需要位置权限,因为蓝牙扫描可用于收集有关用户位置的信息." 来自https://developer.android.com/guide/topics/connectivity/bluetooth (2认同)
  • @dgnuff 打开定位服务与打开 GPS 硬件不同。这意味着应用程序可能会使用 GPS——通常在前台,因为最新版本的 Android 非常热衷于不允许后台应用程序。 (2认同)
  • 仅供参考:对于 Android 10,如果 GPS 关闭,则不会在触发、经典或 LE 中进行设备搜索回调。该框架不会抛出错误或警告,只是默默地失败。 (2认同)

JiT*_*HiN 11

我通过在gradle文件中设置targetSdkVersion22来解决这个问题.您必须ACCESS_COARSE_LOCATION在清单中声明,但即使用户从应用程序设置中拒绝此权限,BLE扫描也会起作用.

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

  • 这不再是一个解决方案(请参阅https://developer.android.com/distribute/best-practices/develop/target-sdk"Google Play将要求新应用程序从8月开始至少针对Android 8.0(API级别26) 1,2018年,该应用程序从2018年11月1日起更新目标Android 8.0.") (2认同)

小智 8

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