|
|
|
@ -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<String>?, |
|
|
|
) { |
|
|
|
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<ScanFilter>() |
|
|
|
// 如果提供了额外的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() |
|
|
|
} |
|
|
|
} |
|
|
|
} |