我正在使用 Android 端的 BluetoothLeScanner 将 Android 设备连接到 iOS。第一次一切都完美无缺。
问题是,在我连接到其中一台已发现的 iOS 设备后,我停止扫描 (stopScan(scanCallback)) 以节省电量。
如果后来以前连接的设备由于某种原因断开连接,我会再次开始扫描...但“重新启动”扫描似乎不再起作用 - 它不会发现更多设备...不知道为什么,但我被迫重新启动应用程序。
任何想法如何解决这一问题?
我还使用 ScanFilter 按 UUID 过滤设备,并使用 ScanSettings.SCAN_MODE_BALANCED 进行扫描模式。
这是代码:
private void startScanner() {
BluetoothManager bluetoothManager = (BluetoothManager) activity.getSystemService(activity.BLUETOOTH_SERVICE);
BluetoothAdapter adapter = bluetoothManager.getAdapter();
scanner = adapter.getBluetoothLeScanner();
ScanSettings settings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_BALANCED).build();
scanner.startScan(scanFilters(), settings, scanCallback);
System.out.println("Scanner started");
}
private List<ScanFilter> scanFilters() {
ScanFilter filter = new ScanFilter.Builder().setServiceUuid(THE_BT_UUID).build();
List<ScanFilter> list = new ArrayList<ScanFilter>(1);
list.add(filter);
return list;
}
private final ScanCallback scanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
BluetoothDevice device = result.getDevice();
if (device != null) {
callback.foundRemoteDevice(BluetoothCentral.this, device);
}
}
}
public void connectToDevice(BluetoothDevice device) {
if (gatt == null) {
gatt = device.connectGatt(activity, false, gattCallback);
scanner.stopScan(scanCallback);
}
}
private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
System.out.println("onConnectionStateChange; status: " + status + ", state: " + newState);
switch (newState) {
case BluetoothProfile.STATE_CONNECTED:
System.out.println("STATE_CONNECTED");
if (!startedServiceDiscovery) {
gatt.discoverServices();
startedServiceDiscovery = true;
}
break;
case BluetoothProfile.STATE_DISCONNECTED:
callback.didDisconnectFromDevice(BluetoothCentral.this, gatt.getDevice());
gatt = null;
startScanner();
break;
default:
System.out.println("STATE_OTHER");
}
}
}
请注意,我在 connectGatt 调用后立即停止扫描仪,并在收到 BluetoothProfile.STATE_DISCONNECTED 回调时再次启动扫描仪。