【问题标题】:Android 12: BLE Scan does not find any devicesAndroid 12:BLE 扫描未找到任何设备
【发布时间】:2022-01-04 12:12:00
【问题描述】:

我正在尝试将蓝牙低功耗应用(连接到自定义物理设备)升级到 Android 12。我已按照文档中的说明设置了所有内容,但它不起作用。

权限:

<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BILLING" />

<uses-feature
    android:name="android.hardware.bluetooth_le"
    android:required="true" />

代码:

private final ScanCallback scanCallback = new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        Log.d(TAG, "Scan result!");
    }

    @Override
    public void onScanFailed(int errorCode) {
        Log.w(TAG, "Scan failed: " + errorCode);
    }
};

public void start() {
    bluetoothLeScanner.startScan(scanCallback);
}

我还使用ActivityResultContracts.RequestMultiplePermissions() 合约请求权限。当我阅读日志时,我可以看到权限已设置。

现在,当我调用 start()-Method 时,我从未调用过 onScanResult(...)-Method。当我切换到装有 Android 11 的设备时,它可以正常工作。当我启动 BLE Scanner 应用程序(从 Play 商店)时,它会找到设备。

更新:当我将 targetSdk 重新设置为 30 时,一切正常(当然有旧权限等)。

有没有人有同样的问题,甚至解决了它?如有任何建议,将不胜感激。

谢谢!

【问题讨论】:

  • BLUETOOTH_ADVERTISEBLUETOOTH_CONNECTBLUETOOTH_SCAN 是运行时权限,因此应用程序必须明确请求用户批准。我在你的 sn-p 中看不到这个。欲了解更多信息:developer.android.com/guide/topics/connectivity/bluetooth/…
  • @Risto 感谢您对此的解释。但我已经这样做了。我会更新我的帖子。
  • 我假设您的目标 sdk 是 31 (Android 12)?
  • 嗨@MichaelKotzjan,我的目标 SDK 是 31,为了测试目的,我将其更改为 32
  • 也许你可以在这个帖子上找到一些答案:stackoverflow.com/questions/67722950/…

标签: android bluetooth-lowenergy upgrade


【解决方案1】:

我找到了解决方案。与official documentation 中的声明相反,您仍然需要在清单中设置android.permission.ACCESS_FINE_LOCATIONandroid.permission.ACCESS_COARSE_LOCATION 权限并向移动用户请求它们。现在一切都恢复正常了。

【讨论】:

  • 这很奇怪。我的 Pixel 3 和 Android 12 上当然不需要它。
  • 我让其他人对此进行了测试,即使在具有 android 12 ble 的较新三星设备上也无法找到仅具有蓝牙权限的设备。 BLE 扫描仪应用程序也会查询这些
  • 对我来说,Android 12 (Samsung S10) 上的 BLE 扫描仪会发现一些设备,但会过滤其他设备,即使有位置权限也是如此。尚未解决此问题。
  • @Alektas 来自官方文档,这可能会有所帮助。 “如果您在 android:usesPermissionFlags 中包含 neverForLocation,则会从扫描结果中过滤掉一些 BLE 信标。”
  • 所以 Android 文档是错误的......将它们声明到清单中就足够了,或者还要求它们运行时?
【解决方案2】:

我发现 Andriod 12 仍然需要启用定位服务,android.permission.ACCESS_FINE_LOCATION 以及 AndroidManifest 中的 android.permission.BLUETOOTH_SCAN 没有 android:usesPermissionFlags="neverForLocation" 标志,并且用户在运行时显式授予这些权限以搜索信标设备。

如果在 AndroidManifest 中将标志 android:usesPermissionFlags="neverForLocation" 添加到 android.permission.BLUETOOTH_SCAN 权限,则可以在没有位置服务和 ACCESS_FINE_LOCATION 的情况下找到其他设备类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2015-03-18
    • 1970-01-01
    • 2021-02-11
    相关资源
    最近更新 更多