Browse Source

Merge branch 'new_dev' of https://github.com/deepcloud2048/deep_voice into new_dev

weicu
liwei1dao 1 year ago
parent
commit
62fba01a09
  1. 104
      local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt

104
local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt

@ -140,6 +140,21 @@ object BleService {
// 初始化状态 // 初始化状态
private var isInitialized = false private var isInitialized = false
/**
* 检查是否有蓝牙扫描权限
*/
private fun hasBluetoothScanPermission(): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
// Android 12+ 需要 BLUETOOTH_SCAN 权限
context.checkSelfPermission(Manifest.permission.BLUETOOTH_SCAN) ==
android.content.pm.PackageManager.PERMISSION_GRANTED
} else {
// Android 12 以下使用 ACCESS_FINE_LOCATION 权限
context.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) ==
android.content.pm.PackageManager.PERMISSION_GRANTED
}
}
// 音频数据统计相关变量 // 音频数据统计相关变量
private var bytesReceivedInCurrentSecond = 0 private var bytesReceivedInCurrentSecond = 0
@ -280,18 +295,22 @@ object BleService {
/** /**
* 开始主动扫描BLE设备 * 开始主动扫描BLE设备
* @param uuids 要扫描的服务UUID列表
* @param timeout 扫描超时时间(毫秒) * @param timeout 扫描超时时间(毫秒)
* @return 是否成功开始扫描 * @return 是否成功开始扫描
*/ */
fun startScan(uuids: List<String>, timeout: Long = 15000): Boolean { fun startScan(uuids: List<String>, timeout: Long = 15000): Boolean {
// Log.i(TAG, "liwei---------startScan 1 $deviceName")
if (!isInitialized) { if (!isInitialized) {
Log.e(TAG, "BLE服务未初始化") Log.e(TAG, "BLE服务未初始化")
return false return false
} }
// Log.i(TAG, "liwei---------startScan 2")
// 获取一个局部引用,避免并发访问问题 // 检查蓝牙扫描权限
// val scanner = bluetoothLeScanner ?: return false if (!hasBluetoothScanPermission()) {
Log.e(TAG, "开始扫描失败: 缺少 BLUETOOTH_SCAN 权限")
return false
}
// 💡 每次都重新取最新实例 // 💡 每次都重新取最新实例
val scanner = bluetoothLeScanner ?: run { val scanner = bluetoothLeScanner ?: run {
Log.e(TAG, "bluetoothLeScanner == null,尝试重启蓝牙") Log.e(TAG, "bluetoothLeScanner == null,尝试重启蓝牙")
@ -299,58 +318,65 @@ object BleService {
return false return false
} }
// Log.i(TAG, "liwei---------startScan 3")
if (isScanning) return false if (isScanning) return false
// Log.i(TAG, "liwei---------startScan 4")
Log.i(TAG, "开始主动扫描BLE设备...") Log.i(TAG, "开始主动扫描BLE设备...")
scanResults.clear() scanResults.clear()
// Log.i(TAG, "liwei---------startScan 5")
val filter = ScanFilter.Builder() // 构建扫描过滤器 - 参考 registerBackgroundScan 的实现
// .setServiceUuid(ParcelUuid(BleConst.PRIMARY_SERVICE_UUID)) val filters = mutableListOf<ScanFilter>()
// .setServiceUuid(ParcelUuid(java.util.UUID.fromString("00000201-0000-1000-8000-00805f9b34fb")))
.build() // 如果提供了额外的UUID,也添加到过滤器中
// val filters = uuids.mapNotNull { uuidStr -> uuids.forEach { uuidStr ->
// try { try {
// // 清理UUID字符串,移除非十六进制字符 val uuid = when {
// val cleanUuidStr = uuidStr.replace("[^0-9A-Fa-f]".toRegex(), "") uuidStr.length == 4 -> {
// // 短UUID,转换为完整UUID
// // 验证清理后的字符串长度(应该是4位十六进制字符) val fullUuid = "0000$uuidStr-0000-1000-8000-00805f9b34fb"
// if (cleanUuidStr.length != 4) { UUID.fromString(fullUuid)
// Log.w(TAG, "无效的UUID格式: $uuidStr,清理后: $cleanUuidStr,长度: ${cleanUuidStr.length}") }
// return@mapNotNull null uuidStr.length == 36 -> {
// } // 完整UUID
// UUID.fromString(uuidStr)
// val fullUuid = "0000$cleanUuidStr-0000-1000-8000-00805f9b34fb" }
// Log.d(TAG, "扫描uuid: $fullUuid") else -> {
// Log.w(TAG, "无效的UUID格式: $uuidStr")
// ScanFilter.Builder() return@forEach
// .setServiceUuid(ParcelUuid(UUID.fromString(fullUuid))) }
// .build() }
// } catch (e: IllegalArgumentException) {
// Log.e(TAG, "构造UUID失败: $uuidStr", e) val filter = ScanFilter.Builder()
// null //.setServiceUuid(ParcelUuid(uuid))
// } .build()
// } filters.add(filter)
Log.d(TAG, "添加扫描过滤器UUID: $uuid")
} catch (e: IllegalArgumentException) {
Log.e(TAG, "构造UUID失败: $uuidStr", e)
}
}
// 扫描设置 - 参考 registerBackgroundScan 的配置
val settings = ScanSettings.Builder() val settings = ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_POWER) .setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)
.setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES) // 推荐:不会触发权限问题 .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
.setReportDelay(0) .setReportDelay(0)
.build() .build()
// Log.i(TAG, "liwei---------startScan 7")
try { try {
scanner.startScan(listOf(filter), settings, scanCallback) // 使用过滤器列表进行扫描
scanner.startScan(filters, settings, scanCallback)
isScanning = true isScanning = true
// Log.i(TAG, "liwei---------startScan 8")
// 设置扫描超时 // 设置扫描超时
scanHandler.postDelayed({ scanHandler.postDelayed({
Log.d(TAG, "扫描超时,停止扫描") Log.d(TAG, "扫描超时,停止扫描")
stopScan() stopScan()
}, timeout) }, timeout)
// Log.i(TAG, "liwei---------startScan 9")
Log.i(TAG, "已启动BLE扫描,过滤器数量: ${filters.size}")
return true return true
} catch (e: Exception) { } catch (e: Exception) {
Log.e(TAG, "启动扫描失败: ${e.message}", e) Log.e(TAG, "启动扫描失败: ${e.message}", e)
// Log.i(TAG, "liwei---------startScan 10")
isScanning = false isScanning = false
return false return false
} }

Loading…
Cancel
Save