Android12:BLE Scan没有发现任何设备

Android 12: BLE Scan does not find any devices

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

权限:

<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()-方法时,我从未调用过 onScanResult(...)-方法。当我切换到带有 Android 11 的设备时,它可以正常工作。当我启动 BLE 扫描仪应用程序(从 Play 商店)时,它找到了设备。

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

有没有人遇到同样的问题,甚至已经解决了?如有任何建议,我们将不胜感激。

谢谢!

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

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

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