我想设置一个 ScanFilter 以根据其广告数据扫描 BLE 设备:名称、服务 UUID 及其制造数据的第一个字符。问题是:当我使用 ScanFilter 时,没有回调,这意味着 .onScanResult() 没有被调用。
设备名称是正确的,因为我已经通过在回调中找到设备进行了测试。当我不使用 ScanFilter 时,会有回调,并且可以通过其名称找到设备。并且可以成功连接到设备。
这是我有问题的代码。你能帮忙指出它的问题吗?
另外,我还有一个问题:.setManufacturerData() 的三个参数如何输入?
protected void scan(){ List<ScanFilter> filters = new ArrayList<>(); ScanFilter filterName = new ScanFilter.Builder().setDeviceName(this.mDeviceName).build(); filters.add(filterName); //ScanFilter filterUUID = new ScanFilter.Builder().setServiceUuid(ParcelUuid.fromString("00001814-0000-1000-8000-00805F9B34FB")).build(); //filters.add(filterUUID); //ScanFilter filterManu = new ScanFilter.Builder().setManufacturerData().build(); //filters.add(filterManu); ScanSettings settings = (new Builder()).setScanMode(2).build(); this.mBluetoothLeScanner.startScan(filters, settings, this); this.mScanning = true; } @Override public void onScanResult(int callbackType, ScanResult result) { super.onScanResult(callbackType, result); BluetoothDevice _device = result.getDevice(); Log.i("onScanResult", " callback function is being called"); // find device by name if (_device != null && _device.getName() != null && _device.getName().matches(this.mDeviceName) ) { this.stopScan(); this.mDevice = _device; Log.i(TAG, "mac address : " + this.mDevice.getAddress() + ", name : " + this.mDevice.getName()); this.mDeviceFoundLatch.countDown(); } long m = mDeviceFoundLatch.getCount(); Log.i("onResultscallbackLatch", String.valueOf(m)); }
我得到了这些错误:
E/ScanRecord: unable to parse scan record: [2, 1, 6, 3, 2, 20, 24, 2, -1, 82, 20, 9, 83, 116, 114, 105, 100, 97, 108, 121, 122, 101, 114, 32, 73, 78, 83, 73, 71, 72, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
E/BluetoothServiceJni: An exception was thrown by callback 'btgattc_scan_result_cb'.
E/BluetoothServiceJni: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.Map.get(java.lang.Object)' on a null object reference
at android.bluetooth.le.ScanRecord.getServiceData(ScanRecord.java:121)
at android.bluetooth.le.ScanFilter.matches(ScanFilter.java:305)
at com.android.bluetooth.gatt.GattService.matchesFilters(GattService.java:659)
at com.android.bluetooth.gatt.GattService.onScanResult(GattService.java:611)
这是正确运行的代码。我可以用它来查找设备。但我想按其制造数据过滤设备。扫描时是否必须设置过滤器?无论如何在这里通过其制造数据过滤设备?
protected void scan(){
ScanSettings settings = (new Builder()).setScanMode(2).build();
this.mBluetoothLeScanner.startScan(null, settings, this);
this.mScanning = true;
}
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
BluetoothDevice _device = result.getDevice();
if (_device != null && _device.getName() != null && _device.getName().matches(this.mDeviceName) ) {
this.stopScan();
this.mDevice = _device;
this.mDeviceFoundLatch.countDown();
}
}