diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index a855ec38d..e208e74bc 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -1032,7 +1032,10 @@ class BleManager extends GetxService { } /// 注册后台扫描 - Future registerBackgroundScan({String? macAddress}) async { + Future registerBackgroundScan({ + String? macAddress, + List? uuids, + }) async { try { // 保存设备地址信息 if (macAddress != null) { @@ -1040,11 +1043,15 @@ class BleManager extends GetxService { // 从蓝牙管理器获取设备名称 final bluetoothManager = Get.find(); _currentDeviceName = bluetoothManager.currentDevice?.name ?? ""; + Logger.info( '保存设备信息: address=$currentDeviceAddress, name=$_currentDeviceName'); } - return await _bleService.registerBackgroundScan(macAddress: macAddress); + return await _bleService.registerBackgroundScan( + macAddress: macAddress, + uuids: uuids, + ); } catch (e) { Logger.error('注册后台扫描失败: ${e.toString()}'); return false; diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart index 3551167a3..2015dac07 100644 --- a/lib/modules/pairing/controllers/pairing_controller.dart +++ b/lib/modules/pairing/controllers/pairing_controller.dart @@ -710,7 +710,9 @@ class PairingController extends GetxController with WidgetsBindingObserver { if (_verifiedDeviceAddress != null) { // await _bleManager.connect(); final success = await _bleManager.registerBackgroundScan( - macAddress: _verifiedDeviceAddress); + macAddress: _verifiedDeviceAddress, + uuids: AppConfig.allproductUuids(), + ); if (!success && _currentState.value == PairingState.waitingBle) { _setError( ErrorType.bleTimeout, 'blePairingStartupFailed'.tr); //BLE配对启动失败 diff --git a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCompanionManager.kt b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCompanionManager.kt index 5e73b6aaf..52f7e2acd 100644 --- a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCompanionManager.kt +++ b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCompanionManager.kt @@ -18,6 +18,7 @@ import android.os.Build import android.os.ParcelUuid import androidx.annotation.RequiresApi import android.util.Log +import java.util.UUID import java.util.regex.Pattern /** @@ -375,8 +376,12 @@ class BleCompanionManager(private val context: Context) { * * @param macAddress 可选的MAC地址,如果不提供则使用已保存的MAC地址 */ - fun registerBackgroundScan() { + fun registerBackgroundScan( + macAddress: String?, + uuids: List?, + ) { try { + Log.d(TAG, "添加后台扫描过滤器UUID: $uuids, macAddress: $macAddress") val mac = getPairedMacAddress() if (mac.isNullOrEmpty()) { Log.e(TAG, "注册后台扫描失败: 没有配对的设备MAC地址") @@ -392,12 +397,43 @@ class BleCompanionManager(private val context: Context) { return } unregisterBackgroundScan() - // 构建过滤器 - val filter = ScanFilter.Builder() - .setDeviceAddress(mac) - // .setServiceUuid(ParcelUuid(java.util.UUID.fromString("0000FEAA-0000-1000-8000-00805F9B34FB"))) - //.setManufacturerData(0xEFAB, byteArrayOf(0xA0.toByte(), 0x01)) - .build() + + // 构建扫描过滤器 - 参考 registerBackgroundScan 的实现 + val filters = mutableListOf() + // 如果提供了额外的UUID,也添加到过滤器中 + uuids?.forEach { uuidStr -> + try { + val uuid = when { + uuidStr.length == 4 -> { + // 短UUID,转换为完整UUID + val fullUuid = "0000$uuidStr-0000-1000-8000-00805f9b34fb" + UUID.fromString(fullUuid) + } + uuidStr.length == 36 -> { + // 完整UUID + UUID.fromString(uuidStr) + } + else -> { + Log.w(TAG, "无效的UUID格式: $uuidStr") + return@forEach + } + } + + val filter = ScanFilter.Builder() + .setServiceUuid(ParcelUuid(uuid)) + .build() + filters.add(filter) + Log.d(TAG, "添加后台扫描过滤器UUID: $uuid") + } catch (e: IllegalArgumentException) { + Log.e(TAG, "构造UUID失败: $uuidStr", e) + } + } + // val filter = ScanFilter.Builder() + + // //.setDeviceAddress(mac) + // // .setServiceUuid(ParcelUuid(java.util.UUID.fromString("0000FEAA-0000-1000-8000-00805F9B34FB"))) + // //.setManufacturerData(0xEFAB, byteArrayOf(0xA0.toByte(), 0x01)) + // .build() // 扫描设置 val settings = ScanSettings.Builder() @@ -420,7 +456,7 @@ class BleCompanionManager(private val context: Context) { ) // 启动后台扫描 - bluetoothLeScanner.startScan(listOf(filter), settings, pendingIntent) + bluetoothLeScanner.startScan(filters, settings, pendingIntent) Log.i(TAG, "已注册后台扫描,目标设备MAC: $mac") } catch (e: Exception) { Log.e(TAG, "注册后台扫描失败: ${e.message}", e) @@ -514,4 +550,4 @@ class BleCompanionManager(private val context: Context) { ) return macPattern.matcher(macAddress).matches() } -} \ No newline at end of file +} \ No newline at end of file diff --git a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleServicePlugin.kt b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleServicePlugin.kt index e4b456c91..edafa1b57 100644 --- a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleServicePlugin.kt +++ b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleServicePlugin.kt @@ -290,7 +290,12 @@ class BleServicePlugin : FlutterPlugin, MethodCallHandler, ActivityAware, result.success("") } "registerBackgroundScan" -> { - bleCompanionManager.registerBackgroundScan() + val macAddress = call.argument("macAddress") + val uuids = call.argument>("uuids") + bleCompanionManager.registerBackgroundScan( + macAddress, + uuids, + ) result.success(true) } "unregisterBackgroundScan" -> { diff --git a/local_plugins/ble_service/lib/ble_service.dart b/local_plugins/ble_service/lib/ble_service.dart index bf10c4736..5b0a5e510 100644 --- a/local_plugins/ble_service/lib/ble_service.dart +++ b/local_plugins/ble_service/lib/ble_service.dart @@ -393,10 +393,18 @@ class BleService { /// 这是确保设备可以在应用后台时被自动连接的关键功能 /// /// [macAddress] 可选的设备MAC地址,如果不提供则使用已关联的设备 - Future registerBackgroundScan({String? macAddress}) async { + Future registerBackgroundScan({ + String? macAddress, + List? uuids, + }) async { try { - final result = - await _methodChannel.invokeMethod('registerBackgroundScan'); + final result = await _methodChannel.invokeMethod( + 'registerBackgroundScan', + { + 'macAddress': macAddress, + 'uuids': uuids, + }, + ); return result ?? false; } catch (e) { print('注册后台扫描失败: $e');