在Android 10.0上启用位置服务以进行低功耗蓝牙扫描。

5
在将我的Pixel XL升级到Android 10.0版本后,只有在开启位置信息时蓝牙低功耗(BLE)扫描才能正常工作。这之前并没有这个问题,并且在运行Android 9.0、8.0和6.0.1的多个设备上都可以正常工作。我的应用程序仅在前台使用BluetoothLeScanner startScan(List filters, ScanSettings settings, ScanCallback callback)进行扫描。我的应用程序已经被授予了FINE_LOCATION、COARSE_LOCATION和BLUETOOTH权限,我尝试添加ACCESS_BACKGROUND_LOCATION权限但并没有成功。是否在Android 10.0中对于应用程序扫描蓝牙设备有更严格的要求呢?我找不到相关信息,希望我的应用程序无需要求用户开启位置信息就可以正常工作。

我相信在 Android10 之前我就遇到过这个问题。 - ror
也许你正在测试时开启了位置功能,但是没有意识到吧。我用的是 BLE 应用,在其他版本中也会发生这种情况。看看这个话题:https://dev59.com/TVwY5IYBdhLWcg3wEEV2 - Shermano
当我关闭位置时,使用前台应用程序运行时,我会收到onScanResults。 BluetoothAdapter.getDefaultAdapter().getBluetoothLeScanner().startScan(...)。 我的应用程序已上线,我们收到了一位Android 10用户的投诉,并在我的手机上进行测试时出现了相同的问题。 - GudniPall
@GudniPall 你能解决吗?我也遇到了同样的问题。如果可能,请查看 https://stackoverflow.com/questions/65105856/bluetooth-scanner-not-discovering-devices-android - WISHY
@WISHY 对于运行 Android 10 的设备,必须打开位置信息。 我添加了一个弹出窗口,询问用户是否要启用位置信息,如果它被关闭的话。 - GudniPall
请参考我的回答,您会找到所需内容。 - Alex Rivas
2个回答

8
自 Android 10 开始,为了执行蓝牙操作,必须打开 ACCESS_FINE_LOCATION 权限。原因是蓝牙可以用于收集用户位置信息(例如使用 BLE Beacon),因此相关应用程序权限应该声明。

对于 Android 9 及更低版本,ACCESS_COARSE_LOCATION 足以满足要求,这可能是您的应用程序没有问题的原因。

可在以下链接中查找更多信息:

希望这有所帮助。


3
是的,但如果您的应用程序针对Android 9(API级别28)或更低版本,则即使在Android 10上,您仍可以继续使用ACCESS_COARSE_LOCATION。 - Martijn van Welie

0

在 Android 10 上请求这三个权限

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

在清单中声明并在运行时请求


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接