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_LOCATION
和 android.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
的情况下找到其他设备类型。
我正在尝试将低功耗蓝牙应用程序(连接到自定义物理设备)升级到 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_LOCATION
和 android.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
的情况下找到其他设备类型。