配套设备配对:是否需要启用位置服务?

Companion device pairing: Is location services needed to be enabled?

我已经实现了 Companion device pairing,它适用于大多数设备,无需任何位置许可或启用位置服务。但是,我们发现例如小米 Redmi Note 10 Pro (Android 11) 在禁用位置服务时 BLE 扫描超时。

  1. 我是否仍需要实施要求在扫描前启用位置服务,或者这是不受欢迎的行为?我希望这个系统级 BLE 扫描不再需要它。
  2. 如果是这样,有没有办法区分哪个设备需要它?我不想在不需要时强迫所有人(例如我的 Pixel 5)

在我看来,Companion Device 功能是仓促实施和设计的。您可能会遇到必须打开“位置服务”之类的错误,并且配套设备配对对话框在未启用时不会发出警告。在小米或 Google 修复此错误之前,您将需要在您的应用程序中有变通办法,例如,如果您认为需要,请告诉用户首先启用位置服务。

我在应用扫描过滤器时也遇到了问题。这完全是一场噩梦。

我是从这个开始的:

val filter = ScanFilter.Builder().apply {
            setManufacturerData(SOME_INDEX, byteArrayOf(1))
            setDeviceName(SOME_NAME)
            setServiceUuid(ParcelUuid.fromString(SOME_UUID))
        }.build()

最后,我只有这个:

ScanFilter.Builder().apply {
            setManufacturerData(SOME_INDEX, byteArrayOf(1))
        }.build()

因为 setServiceUuid() 在所有经过测试的华为手机和索尼 Xperia X 上都不起作用。

并且 setDeviceName() 在三星 S10e 上无法正常工作。最后我通过直接申请找到了名称过滤的解决方案:

BluetoothLeDeviceFilter.Builder()
        .setNamePattern(Pattern.compile(SOME_NAME))
        .setScanFilter(filter)