SDK_APP/DEVICE_SELECTION_IMPROVEMEN...

8.2 KiB
Raw Blame History

设备选择功能改进测试指南

🎯 改进内容

1. 显示所有扫描到的设备

  • 问题之前只显示前8个设备
  • 解决使用RecyclerView显示所有扫描到的设备
  • 实现:移除设备数量限制,显示完整设备列表

2. 点击任意设备连接

  • 问题:之前只能选择前两个设备
  • 解决:每个设备都可以点击连接
  • 实现RecyclerView的每个item都可以点击

3. 扫描完成后立即弹出对话框

  • 问题:扫描完成后可能延迟弹出对话框
  • 解决:扫描停止时立即触发回调
  • 实现:在stopBleScan()中立即调用onScanComplete

📱 现在的UI布局

设备选择对话框

┌─────────────────────────────────────────┐
│        选择蓝牙设备 (找到 5 个设备)        │
├─────────────────────────────────────────┤
│  ┌─────────────────────────────────────┐ │
│  │ iPhone                              │ │
│  │ 00:11:22:33:44:55                   │ │
│  └─────────────────────────────────────┘ │
│  ┌─────────────────────────────────────┐ │
│  │ AirPods                             │ │
│  │ AA:BB:CC:DD:EE:FF                   │ │
│  └─────────────────────────────────────┘ │
│  ┌─────────────────────────────────────┐ │
│  │ 小米手环                             │ │
│  │ 11:22:33:44:55:66                   │ │
│  └─────────────────────────────────────┘ │
│  ┌─────────────────────────────────────┐ │
│  │ Samsung Galaxy                      │ │
│  │ 22:33:44:55:66:77                   │ │
│  └─────────────────────────────────────┘ │
│  ┌─────────────────────────────────────┐ │
│  │ Huawei Watch                        │ │
│  │ 33:44:55:66:77:88                   │ │
│  └─────────────────────────────────────┘ │
├─────────────────────────────────────────┤
│                    [取消]                 │
└─────────────────────────────────────────┘

🚀 测试步骤

第一步:启动蓝牙扫描

  1. 点击"连接蓝牙"按钮
  2. 观察扫描过程
    蓝牙状态: 正在扫描蓝牙设备...
    发现设备: iPhone (00:11:22:33:44:55)
    发现设备: AirPods (AA:BB:CC:DD:EE:FF)
    发现设备: 小米手环 (11:22:33:44:55:66)
    

第二步:验证扫描完成提示

  1. 扫描完成后
    • 显示"扫描完成,找到 X 个设备"
    • 立即弹出设备选择对话框
    • 对话框标题显示设备数量

第三步:验证设备列表

  1. 检查设备列表
    • 显示所有扫描到的设备
    • 每个设备显示名称和地址
    • 列表可以滚动(如果设备很多)

第四步:测试设备选择

  1. 点击任意设备
    • 点击第一个设备
    • 点击中间的设备
    • 点击最后一个设备
    • 每个设备都能正常连接

第五步:验证连接过程

  1. 连接状态变化
    • 按钮文字变为"连接中..."
    • 按钮颜色变为橙色
    • 状态信息更新

🔧 关键代码修改

1. 设备适配器

private inner class DeviceAdapter : RecyclerView.Adapter<DeviceAdapter.DeviceViewHolder>() {
    
    override fun onBindViewHolder(holder: DeviceViewHolder, position: Int) {
        val device = devices[position]
        val deviceName = device.name ?: "未知设备"
        val deviceAddress = device.address
        holder.textView.text = "$deviceName\n$deviceAddress"
        
        holder.itemView.setOnClickListener {
            onDeviceSelectedListener?.invoke(device)
            dismiss()
        }
    }
    
    override fun getItemCount(): Int = devices.size
}

2. 对话框实现

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    val builder = AlertDialog.Builder(requireContext())
    builder.setTitle("选择蓝牙设备 (找到 ${devices.size} 个设备)")
    
    if (devices.isEmpty()) {
        builder.setMessage("未找到蓝牙设备")
        builder.setPositiveButton("重新扫描") { _, _ -> dismiss() }
        builder.setNegativeButton("取消") { _, _ -> dismiss() }
    } else {
        // 创建RecyclerView显示所有设备
        val recyclerView = RecyclerView(requireContext()).apply {
            layoutManager = LinearLayoutManager(requireContext())
            adapter = DeviceAdapter()
            
            // 设置固定高度,避免对话框过大
            layoutParams = ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                600 // 固定高度600dp
            )
        }
        
        builder.setView(recyclerView)
        builder.setNegativeButton("取消") { _, _ -> dismiss() }
    }
    
    return builder.create()
}

3. 扫描完成回调

override fun onScanComplete(devices: List<BluetoothDevice>) {
    runOnUiThread {
        updateStatus("扫描完成,找到 ${devices.size} 个设备")
        
        if (devices.isNotEmpty()) {
            // 立即显示设备选择对话框
            val dialog = BluetoothDeviceDialog.newInstance(devices)
            dialog.setOnDeviceSelectedListener { device ->
                // 连接选中的设备
                bluetoothManager.connectToDevice(device)
                binding.bluetoothButton.text = "连接中..."
                binding.bluetoothButton.setBackgroundColor(Color.parseColor("#FF9800"))
                updateStatus("正在连接设备: ${device.name ?: device.address}")
            }
            dialog.show(supportFragmentManager, "BluetoothDeviceDialog")
        } else {
            updateStatus("未找到蓝牙设备,请重试")
            binding.bluetoothButton.text = "连接蓝牙"
            binding.bluetoothButton.setBackgroundColor(Color.parseColor("#4CAF50"))
        }
    }
}

4. BLE扫描停止

private fun stopBleScan() {
    try {
        bluetoothLeScanner?.stopScan(bleScanCallback)
        Log.d(TAG, "BLE扫描已停止")
        
        // 扫描完成后立即触发回调
        callback?.onStatusChanged("扫描完成,找到 ${discoveredDevices.size} 个设备")
        callback?.onScanComplete(discoveredDevices.toList())
    } catch (e: Exception) {
        Log.e(TAG, "停止BLE扫描失败: ${e.message}")
    }
}

⚠️ 注意事项

1. 设备显示

  • 显示所有扫描到的设备,无数量限制
  • 每个设备显示名称和地址
  • 支持滚动查看(如果设备很多)

2. 连接选择

  • 点击任意设备都可以连接
  • 连接后对话框自动关闭
  • 支持取消操作

3. 性能优化

  • 使用RecyclerView提高性能
  • 固定对话框高度避免过大
  • 扫描完成后立即弹出

🎉 预期效果

扫描过程:

  • 显示扫描进度
  • 实时显示发现的设备
  • 扫描完成后立即提示

设备选择:

  • 显示所有扫描到的设备
  • 每个设备都可以点击
  • 对话框响应流畅

连接过程:

  • 点击设备后立即开始连接
  • 连接状态正确显示
  • 支持连接任意设备

现在你可以扫描所有设备并点击任意设备进行连接了!🎉