219 lines
8.2 KiB
Markdown
219 lines
8.2 KiB
Markdown
|
|
# 设备选择功能改进测试指南
|
|||
|
|
|
|||
|
|
## 🎯 改进内容
|
|||
|
|
|
|||
|
|
### 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. 设备适配器
|
|||
|
|
```kotlin
|
|||
|
|
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. 对话框实现
|
|||
|
|
```kotlin
|
|||
|
|
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. 扫描完成回调
|
|||
|
|
```kotlin
|
|||
|
|
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扫描停止
|
|||
|
|
```kotlin
|
|||
|
|
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提高性能
|
|||
|
|
- 固定对话框高度避免过大
|
|||
|
|
- 扫描完成后立即弹出
|
|||
|
|
|
|||
|
|
## 🎉 预期效果
|
|||
|
|
|
|||
|
|
### 扫描过程:
|
|||
|
|
- ✅ 显示扫描进度
|
|||
|
|
- ✅ 实时显示发现的设备
|
|||
|
|
- ✅ 扫描完成后立即提示
|
|||
|
|
|
|||
|
|
### 设备选择:
|
|||
|
|
- ✅ 显示所有扫描到的设备
|
|||
|
|
- ✅ 每个设备都可以点击
|
|||
|
|
- ✅ 对话框响应流畅
|
|||
|
|
|
|||
|
|
### 连接过程:
|
|||
|
|
- ✅ 点击设备后立即开始连接
|
|||
|
|
- ✅ 连接状态正确显示
|
|||
|
|
- ✅ 支持连接任意设备
|
|||
|
|
|
|||
|
|
现在你可以扫描所有设备并点击任意设备进行连接了!🎉
|