首先,我们需要在AndroidManifest.xml文件中为我们的应用程序添加以下权限:
然后,在我们的代码中,我们需要请求定位权限。如果我们的应用程序没有定位权限,则无法扫描BLE设备:
private void requestLocationPermission() { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION); }
然后,在我们的扫描代码中,我们需要添加一个筛选器,以过滤器它所希望的服务UUID:
private static final UUID SERVICE_UUID = UUID.fromString("00000000-0000-0000-0000-000000000000"); private static final long SCAN_PERIOD = 10000; private Handler mHandler; private BluetoothAdapter mBluetoothAdapter; private BluetoothLeScanner mBluetoothLeScanner;
private void scanLeDevice(final boolean enable) { if (enable) { mHandler.postDelayed(new Runnable() { @Override public void run() { mBluetoothLeScanner.stopScan(mLeScanCallback); } }, SCAN_PERIOD);
ScanFilter filter = new ScanFilter.Builder()
.setServiceUuid(ParcelUuid.fromString(SERVICE_UUID.toString()))
.build();
ScanSettings settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build();
List filters = new ArrayList<>();
filters.add(filter);
mBluetoothLeScanner.startScan(filters, settings, mLeScanCallback);
} else {
mBluetoothLeScanner.stopScan(mLeScanCallback);
}
}
这个筛选器告诉蓝牙扫描器只扫描具有UUID SERVICE_UUID的服务。现在,当您扫描BLE设备时,您应该能够发现缺失的服务UUID。
请注意,这种解决方法仅适用于Android 6.0或更高版本。对于Android 5.0或更低版本,您需要在扫描之前启用位置服务,并在扫描器扫描参数