升级到Android版本6.0后,只有在设备上启用了位置服务时,蓝牙低功耗(BLE)扫描才有效。请参阅此处以供参考:Bluetooth Low Energy startScan on Android 6.0 does not find devices
基本上,您需要为应用程序以及手机启用权限。这是一个错误吗?是否可以在没有实际启用位置服务的情况下扫描?我不想拥有所有应用的位置。
编辑我没有提到我在API 21中提供的startScan()
中使用BluetoothLeScanner
方法。我对该方法所需的清单中的课程和精细位置权限没问题。我只是不希望我的应用程序的用户必须在他们的设备(GPS等)上启用位置服务才能使用我的应用程序。
以前,startScan()
方法将在手机上禁用位置服务的情况下运行并返回结果。但是,在Marshmallow上,相同的应用程序将“扫描”但是静默失败并且在手机上未启用位置服务且课程/精确位置权限仍在清单中时未返回任何结果。
不,这不是一个错误。
这个issue被带到谷歌,他们回应说这是预期的行为,他们不会修复它。他们指示开发人员访问this site,指出现在需要位置权限才能访问硬件标识符。现在,开发人员有责任让用户了解该要求。
然而,在这个问题中,它没有解决为什么需要定位服务(GPS等),并且它们似乎不会重新讨论这个问题来解释这一点,因为它已经被标记为预期的行为。
要回答问题的第二部分:是的,可以在不启用位置服务的情况下进行扫描。您可以使用BluetoothAdapter.getDefaultAdapter().startDiscovery()
进行蓝牙经典扫描,这将关闭位置服务。这将发现所有蓝牙设备,BLE和其他。但是,如果将它们视为startScan()
的结果,BLE设备将没有扫描记录。
我通过在gradle文件中将targetSdkVersion
设置为22来解决这个问题。您必须在清单中声明ACCESS_COARSE_LOCATION
,但即使用户从App Settings拒绝此权限,BLE扫描也会起作用。
这只是一个避免请求位置许可的黑客行为。最好定位最新的Android版本。
我发现在Android 6之后你必须授予ACCESS_COARSE_LOCATION权限。但在某些设备上还需要打开手机定位服务(GPS),以便发现外围设备。我发现使用Nexus 5x和Android 7.0。
我也在清单上试过这个,但没有请求许可,不知道为什么。你是应用程序在启动时提示输入位置权限吗?如果不是,我们需要request for permission on runtime。
此外,您可以检查此项以测试您的应用是否正常运行:
打开设置>应用> YourApplication>权限并启用位置,然后尝试扫描结果。
只有在清单上提供了ACCESS_COARSE_LOCATION时,才会在此处列出位置。
你可以使用BluetoothAdapter.startDiscovery()
。
它将扫描蓝牙智能和经典蓝牙设备,但不需要启用位置服务。
(你仍然需要Android 6上的ACCESS_COARSE_LOCATION
权限。)
您可以在找到的设备上调用BluetoothDevice.getType
来过滤蓝牙智能/低功耗设备。
好吧,我查看了我在Eclipse中编写的代码,并在那里使用了startScan(API 21)函数,而没有在清单文件中声明位置内容。我仍然得到适当的回调。您是否尝试过在没有位置声明的情况下运行代码?另一方面 - 您可以使用不需要这些权限的已弃用的startLeScan(API 18)。但是,在我看来,使用API 18方法搜索和阅读服务中所需的特性更加复杂。
从我最近在Android 8.0上注意到的,不需要打开你的GPS进行BLE扫描,但是你必须在清单中声明它,但是用户必须允许该权限。
当您尝试使用startScan()
方法进行扫描时,Android将提示用户允许位置权限。如果不允许,您的扫描将失败。