我正在尝试在我的应用程序中发现并连接到低功耗蓝牙 (BLE) 设备。我有一个实现,它显示了一些设备,并且能够很好地与它们绑定和通信。但是,我的一个 BLE 设备 (Saveo C200 LF) 从未出现在我的发现扫描中。
我从 Google Play 下载了一个 BLE 扫描仪应用程序,看看 Saveo C200 是否会出现在他们的扫描中,结果确实如此。它会立即显示,他们的应用程序能够连接到它并发现服务等。
我总是看到多个设备出现在我的发现中,并且我能够与其他设备连接/绑定,但我根本无法让这个设备出现在我的发现中,即使它出现在BLE 扫描仪应用程序的发现。
但无论我做什么,我在扫描时都找不到该设备。我没有使用任何过滤器。 我在尝试扫描时遗漏了什么?
private BLEScanCallback bleScanCallback = new BLEScanCallback();
public void bleStartBluetoothDiscovery() {
BluetoothAdapter adapter = getBluetoothAdapter();
if (adapter != null) {
// for bluetooth le
bleScanner = adapter.getBluetoothLeScanner();
if (bleScanner != null) {
// run the discovery for 12 seconds and then automatically stop
bleScheduleEndDiscovery(12);
List<ScanFilter> filters = null;
ScanSettings scanSettings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build()
;
bleScanner.startScan(filters, scanSettings, this.bleScanCallback);
}
}
}
private static class BLEScanCallback extends ScanCallback {
@Override
public void onScanResult(int callbackType, ScanResult result) {
BluetoothDevice device = result.getDevice();
// the address of the Saveo C200 device, got it from the
// 3rd party BLE Scanner app that is able to see it when scanning.
String crfidscanneraddress = "DD:0D:30:5E:1A:AC";
String address = device.getAddress();
String deviceName = device.getName();
deviceName = (deviceName == null) ? "Unknown" : deviceName;
if (address.equals(crfidscanneraddress)) {
Log.d(TAG, "onScanResult: FOUND IT!!! ---> " + deviceName + " [" + address + "] ");
// I'm not just relying on this log, I'm checking through
// all of the results and my device is not found even
// with a different address.
}
Log.d(TAG, "onScanResult: " + deviceName + " [" + address + "] ");
}
// ... etc
}
我正在更新问题以包含我的清单中的权限,我注意到了这一点:
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation"
/>
我删除了
android:usesPermissionFlags="neverForLocation"
,该设备现在立即显示在我的发现中。
我把它放在那里是因为文档表明我实际上并没有尝试使用蓝牙扫描来获取他们的物理位置,然后我可以断言我没有这样做。我认为出于隐私目的这是一个好主意。
https://developer.android.com/develop/connectivity/bluetooth/bt-permissions
但是,文档还指出,设置该标志将导致某些结果被过滤掉。
强烈断言您的应用程序不会获取物理位置
如果您的应用程序不使用蓝牙扫描结果来获取物理数据 位置,您可以强烈断言您的应用程序从未使用 获取物理位置的蓝牙权限。为此,请完成 以下步骤:
将 android:usesPermissionFlags 属性添加到您的 BLUETOOTH_SCAN 权限声明,并将该属性的值设置为 从不ForLocation。
注意:如果您在您的 android:usesPermissionFlags,一些BLE信标从 扫描结果。