Android 12:BLE 扫描未找到任何设备

Luk*_*ner 10 android upgrade bluetooth-lowenergy

我正在尝试将低功耗蓝牙应用程序(连接到自定义物理设备)升级到 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" />
Run Code Online (Sandbox Code Playgroud)

代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

现在,当我调用start()-Method 时,我永远不会onScanResult(...)调用 -Method 。当我切换到装有 Android 11 的设备时,它可以正常工作。当我启动 BLE 扫描仪应用程序(来自 Play 商店)时,它会找到该设备。

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

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

谢谢!

Luk*_*ner 14

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

  • 我让其他人进行了测试,即使在配备 Android 12 BLE 的较新三星设备上,仅使用蓝牙权限也无法找到该设备。BLE 扫描仪应用程序也会查询这些内容 (2认同)

小智 11

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

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

  • 是的,**信标**仍然需要“ACCESS_FINE_LOCATION”。由于信标_显示位置_。`neverForLocation` 属性本质上是说:“我只用它来连接到没有任何已知特定位置的设备。” 当然,这没有详细记录,但这就是我的理解。 (2认同)