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


94

升级到Android 6.0版后,只有在设备上启用了定位服务后,蓝牙低功耗(BLE)扫描才起作用。请参阅此处以供参考:Android 6.0上的Bluetooth Low Energy startScan找不到设备

基本上,您需要为应用程序和电话启用权限。这是错误吗?在没有实际启用位置服务的情况下可以进行扫描吗?我不需要所有应用程序的位置。

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

以前,该startScan()方法将在手机上禁用位置服务的情况下运行并返回结果。但是,在棉花糖上,当未在电话上启用位置服务并且清单中仍包含课程/精确位置权限时,同一应用程序将“扫描”但无提示失败,并且不返回任何结果。


您正在使用什么设备?我在第2代Moto G遇到了同样的问题。Moto G 1st Generation和Nexus 6使用完全相同的代码即可正常运行,而无需显式启用定位服务。
shadowhorst's

我在运行棉花糖的任何设备上都注意到了它-Nexus 5X,三星S6,三星S7,LG G4
V-PTR

Answers:


82

不,这不是错误。

这个问题出现在Google上,他们回答说这是预期的行为,他们不会解决。他们将开发人员定向到该站点该站点指出现在需要位置许可才能访问硬件标识符。现在,使他们的用户意识到要求是开发人员的责任。

但是,在此问题中,它没有解决为何需要定位服务(GPS等)的问题,并且由于已将其标记为预期的行为,因此似乎也没有打算重新访问该问题以进行解释。

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


11
Google声称这不是错误,这让我很冷。他们的态度是朴素的BS。
Marki '18

21
这并不是真正的错误-如果恶意应用程序开发人员可以扫描已知的蓝牙信标,则他们可以通过请求位置权限来找出您的位置而不会引起用户的怀疑。因此,不幸的是,请求BLE访问必须与询问您的粗略位置相同。
ArtHare

3
“ @orionelenzil”您必须声明的另一个权限是ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION。需要位置权限,因为可以使用蓝牙扫描来收集有关用户位置的信息。“ 来自developer.android.com/guide/topics/connectivity/bluetooth
ArtHare

7
让我看看我是否直率。BLE的最大优势是“ LE”位,即低能耗,这意味着电池电量消耗减少。当然,要获得这些节省,我必须打开GPS(这是一种已知的电池消耗),从而抵消了我可能因使用BLE而节省的电量。/ me难以置信地摇了摇头。
dgnuff

8
这难以置信。当然,如果Google担心使用BLE扫描来推断位置,他们应该为此添加一个单独的权限,而不是通过强迫用户允许GPS访问来把婴儿扔进洗澡水中!
Desty

11

我通过在Gradle文件中设置targetSdkVersion22解决了这一问题。您必须ACCESS_COARSE_LOCATION在清单中声明,但是即使用户拒绝了“应用程序设置”中的此权限,BLE扫描也将起作用。

这只是避免请求位置许可的一种手段。最好针对最新的android版本。

编辑

此解决方案不应再使用,因为Google Play要求新应用至少针对Android 8.0(API级别26)。应用程序应请求BLE扫描的位置许可。


十分感谢!您是否知道如何处理模拟监视的库(例如AltBeacon)?不能在:(上没有位置工作,并且它们使用的是基本相同的机制...最小编译版本又如何呢?@JiTHiN
Shahar Lahav

从23降级为22,甚至可以在Android 7.0上使用。我最初的问题是您必须启用本地化,现在我可以扫描禁用本地化的BLE设备。
Mariusz Wiazowski

1
这是一个hack,但是不建议这样做,最好以最新的sdk版本为目标。正确的方法是ACCESS_COARSE_LOCATION在运行时请求
Aaron

2
这不再是一种解决方案(请参阅developer.android.com/distribute/best-practices/develop/… “从2018年8月1日起,Google Play要求新应用的定位至少为Android 8.0(API级别26),并且应用将从2018年11月1日开始针对Android 8.0进行更新。”)
Étienne18年

10

我发现,在Android 6之后,您必须授予ACCESS_COARSE_LOCATION权限。但是在某些设备上,还必须打开电话定位服务(GPS),以便您可以发现外围设备。我发现在Android 7.0上使用Nexus 5x。


1
Nexus 5x和Android 6同样适用于我
受保护的会员

在Moto G5以及Android 7.1.1上相同
RootCode

2

我也在清单上尝试了此操作,但没有请求权限,不确定原因。您的应用是否在启动时提示输入“位置”权限?如果不是,我们需要在runtime上请求许可

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

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

仅当清单上提供ACCESS_COARSE_LOCATION时,才会在此处列出位置。


1
是的,您必须在运行时显式请求权限,并为设备打开位置服务。但是我想知道是否有一种方法可以进行BLE扫描而不必在运行时打开位置服务或请求课程位置许可。
V-PTR

请求权限还不够,您需要检查是否也启用了定位服务。
drindt

2

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

您可以调用BluetoothDevice.getType找到的设备来筛选Bluetooth Smart / Low Energy设备。


0

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


我在中使用该startScan功能BluetoothLeScanner。我故意使用不推荐使用的方法。实际上,我正在检查使用大于21的API的设备,以专门使用提供的新方法。我尝试了没有位置,但它只是默默地失败了。扫描运行,但没有返回任何结果(使用post-API 21方法)
V-PTR 2015年

0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.