Files

504 lines
13 KiB
Markdown
Raw Permalink Normal View History

2026-11-05 14:35:04 +08:00
# 蓝牙开发实施方案
日期:2026-07-09
## 1. 开发目标
在新项目 `F:\zdCode\tongli` 上开发蓝牙功能,使蓝牙业务交互、需求和 UI 与旧项目 `F:\zdCode\tongli_old` 保持一致。
用户要求:
```text
业务逻辑一样,UI 和需求跟老项目一致,代码可以不参考。
```
因此开发策略是:
```text
旧项目 = 需求基线和验收标准
新项目 = 实现架构和平台能力
```
不建议搬旧代码,不建议重写底层蓝牙栈。应优先使用新项目已有 `YX_BluetoothSDK`、ViewModel、Activity、Service 架构补齐业务和 UI。
## 2. 总体开发原则
### 2.1 老项目只做业务参考
老项目重点参考:
- 页面入口
- 操作路径
- 通话状态机
- 联系人/通话记录同步流程
- 蓝牙音乐控制
- 蓝牙设置和设备管理
- 三方通话/第二路来电行为
- 空状态、加载状态、弹窗和提示
不直接复制:
- 老项目 `BtAdapterManager` 底层实现
- 老项目老式 Activity/Fragment 结构
- 老项目 Android 4.4 平台兼容写法
### 2.2 新项目保持现有架构
新项目优先使用:
| 能力 | 新项目承接 |
| -------- | ---------------------------------------------------- |
| 蓝牙电话 | `YX_BlueTooth` |
| 蓝牙 SDK | `YX_BluetoothSDK` |
| 蓝牙音乐 | `YX_BtMusic` 或 `YX_BlueTooth\BluetoothMusicActivity` |
| 桌面卡片 | `YX_Launcher` |
| 状态栏/快捷开关 | `YX_SystemUI` |
核心调用应走:
| 功能 | 控制类 |
| ---------------- | ----------------------------- |
| 拨号/接听/挂断/拒接/DTMF | `BtPhoneControlManager` |
| 联系人 | `BtContactsControlManager` |
| 通话记录 | `BtCallRecordsControlManager` |
| 蓝牙音乐 | `BtMusicControlManager` |
| 蓝牙设置/设备连接 | `BtSettingControlManager` |
| 已配对设备 | `BtPairedControlManager` |
### 2.3 先页面后底层
开发顺序不应从底层 SDK 开始大改,而应:
```text
页面结构对齐
-> 状态和交互对齐
-> ViewModel 调用补齐
-> SDK 缺口验证
-> 系统联动验收
```
## 3. 模块拆分
蓝牙功能按以下模块推进:
| 模块 | 目标 |
|---|---|
| 主界面导航 | 对齐旧项目/截图入口结构 |
| 蓝牙拨号 | 数字输入、拨号、删除、未连接提示 |
| 通话记录 | 记录列表、分类、同步、空状态、点击拨号 |
| 联系人 | 同步、搜索、重新下载、点击拨号 |
| 通话界面 | 来电、拨出、通话中、静音、音频切换、DTMF |
| 三方通话 | 第二路来电、等待、保持、释放当前接听另一通 |
| 蓝牙音乐 | 歌曲信息、进度、播放控制、未连接状态 |
| 蓝牙设置 | 自动接听、开关、名称、配对、扫描、连接/断开 |
| Launcher 联动 | 蓝牙电话卡片、蓝牙音乐卡片 |
| SystemUI 联动 | 状态栏图标、快捷蓝牙开关 |
## 4. 推荐开发顺序
### 阶段 1:冻结页面资产和需求
先产出并确认以下清单:
- 页面清单
- 弹窗清单
- 图标清单
- 按钮清单
- 空状态清单
- 加载状态清单
- 错误状态清单
- 路由/入口清单
- Launcher/SystemUI 联动清单
阶段目标:
```text
开发前知道每个页面长什么样、有哪些状态、点击后去哪里。
```
### 阶段 2:主界面 UI 结构对齐
旧项目和截图里的主入口更接近:
```text
蓝牙拨号
联系人
蓝牙音乐
蓝牙设置
```
新项目当前主界面更接近:
```text
左侧拨号键盘 + 右侧通话记录/通讯录二级切换
```
这里需要先做产品决策:
1. 如果要求 UI 完全跟老项目/截图一致,应把新项目 `MainActivity` 的入口视觉改成四项左侧菜单。
2. 如果只要求业务一致,当前结构可以保留,但必须补齐蓝牙音乐和蓝牙设置入口。
建议:
```text
优先按截图恢复四个左侧入口。
通话记录可以作为蓝牙拨号页右侧区域或拨号页内二级状态。
```
涉及文件:
| 文件 | 说明 |
|---|---|
| `YX_BlueTooth\src\main\java\com\yaxon\bluetooth\main\MainActivity.java` | 主界面控制 |
| `YX_BlueTooth\src\main\res\layout\activity_main.xml` | 主界面布局 |
| `YX_BlueTooth\src\main\res\layout\fragment_call_logs.xml` | 通话记录 |
| `YX_BlueTooth\src\main\res\layout\fragment_contacts.xml` | 联系人 |
### 阶段 3:电话核心流程
先保证最基础电话链路可用:
```text
输入号码
-> 点击拨号
-> 进入拨号中
-> 对方接听
-> 通话中
-> 挂断
-> 返回/关闭通话页
```
再补:
- 来电接听
- 来电拒接
- 通话中静音
- 车机/手机音频切换
- DTMF 小键盘
- 未连接时禁止拨号并提示
涉及文件:
| 文件 | 说明 |
|---|---|
| `BluetoothPhoneActivity.java` | 通话全屏页 |
| `BluetoothPhoneViewModel.java` | 电话动作和状态 |
| `TelephoneWindowControl.java` | 电话窗口 |
| `view_keyboard_dial.xml` | 拨号键盘 |
| `view_keyboard_dtmf.xml` | DTMF 键盘 |
| `view_control_calling.xml` | 通话控制按钮 |
验收重点:
- 来电显示号码/联系人名称
- 拨出显示号码/联系人名称
- 通话计时正确
- 静音图标状态正确
- 车机/手机音频图标状态正确
- DTMF 按键能发出
- 断开蓝牙时通话页正确关闭或提示
### 阶段 4:联系人和通话记录
联系人:
- 未同步状态
- 一键同步
- 正在同步
- 同步成功
- 同步失败
- 空联系人
- 搜索联系人
- 搜索无结果
- 重新下载联系人确认弹窗
- 点击联系人拨号
通话记录:
- 未同步状态
- 一键同步
- 正在同步
- 同步成功
- 暂无记录
- 全部/拨出/已接/未接分类
- 点击通话记录拨号
涉及文件:
| 文件 | 说明 |
|---|---|
| `ContactsFragment.java` | 联系人 UI |
| `ContactListViewModel.java` | 联系人业务 |
| `CallLogsFragment.java` | 通话记录 UI |
| `CallHistoryViewModel.java` | 通话记录业务 |
| `listitem_phonebook.xml` | 联系人条目 |
| `listitem_phonerecord.xml` | 通话记录条目 |
验收重点:
- 蓝牙未连接时显示正确状态
- 手机未授权 PBAP 时提示合理
- 同步中不能重复触发多次
- 搜索支持名称、号码、拼音/首字母
- 点击条目拨号行为一致
### 阶段 5:三方通话专项
老项目明确支持第二路来电/三方通话相关行为:
- `SECOND_PHONE_IN`
- `SECOND_PHONE_PICKUP_OR_REJECT`
- `STATUS_WAITING`
- `STATUS_HELD`
- `EnhancedCallCtrl`
- `RELEASE_ACTIVE_AND_ACCEPT_OTHER`
新项目已有承接:
| 文件 | 说明 |
|---|---|
| `ThirdCallingControl.java` | 三方通话/第二路来电控制 |
| `ThirdCallControlView.java` | 三方通话控制视图 |
| `BluetoothPhoneViewModel.java` | 多通话状态处理 |
| `BluetoothPhoneActivity.java` | 通话状态显示 |
必须单独验收以下场景:
1. 无通话时来电。
2. 通话中第二路来电。
3. 拒接第二路来电。
4. 接听第二路并挂断当前。
5. 接听第二路并保持当前。
6. 当前一路 active,另一路 held。
7. 挂断 active 后 held 是否恢复。
8. 第二路来电号码/名称显示是否正确。
风险:
```text
三方通话最依赖手机、HFP 协议栈和平台蓝牙实现,不能只靠静态代码判断。
必须用真实手机或稳定蓝牙测试设备验证。
```
### 阶段 6:蓝牙音乐
需要先统一入口:
```text
蓝牙音乐入口到底打开 YX_BtMusic,还是 YX_BlueTooth 内的 BluetoothMusicActivity?
```
建议:
- 如果项目已有独立 `YX_BtMusic` 桌面入口,主入口可以跳转 `YX_BtMusic`。
- 如果要求完全贴近老项目“蓝牙 App 内四项菜单”,可以在 `YX_BlueTooth` 内保留音乐页面或 Activity。
- 不建议两个入口长期并存不同逻辑,应统一 ViewModel 和 SDK 状态来源。
功能验收:
- 未连接 A2DP 时显示未连接状态
- 点击连接按钮进入设置或连接流程
- 标题/歌手/封面刷新
- 播放/暂停状态刷新
- 上一首/下一首可用
- 进度和总时长显示
- 手机端切歌后车机 UI 同步
涉及文件:
| 文件 | 说明 |
|---|---|
| `YX_BtMusic\src\main\java\com\yaxon\btmusic\main\MainActivity.java` | 独立蓝牙音乐页 |
| `YX_BtMusic\src\main\java\com\yaxon\btmusic\mvvm\BtMusicViewModel.java` | 独立音乐业务 |
| `YX_BlueTooth\src\main\java\com\yaxon\bluetooth\main\BluetoothMusicActivity.java` | 蓝牙模块内音乐页 |
| `BtMusicControlManager` | 蓝牙音乐控制 |
### 阶段 7:蓝牙设置和设备管理
截图里的蓝牙设置是页面式:
- 自动接听
- 蓝牙开关
- 蓝牙名称
- 已配对设备
- 可用设备
- 修改名称
新项目当前主要承接是 `BtSettingDialog`。
建议:
```text
如果 UI 必须跟截图一致,应做成完整设置页面或主界面右侧设置页。
如果只要求功能一致,可以先保留 BtSettingDialog,再统一视觉。
```
功能验收:
- 蓝牙开关可打开/关闭
- 本机蓝牙名称显示正确
- 本机蓝牙名称可修改
- 已配对设备显示正确
- 可用设备扫描和刷新
- 点击设备可配对/连接
- 已连接设备可断开
- 连接中、连接失败、连接成功状态正确
- 自动接听开关生效
涉及文件:
| 文件 | 说明 |
|---|---|
| `BtSettingDialog.java` | 设置 UI |
| `BtSettingViewModel.java` | 设置业务 |
| `dialog_bt_setting.xml` | 设置弹窗布局 |
| `item_btdev_forum.xml` | 已配对设备条目 |
| `item_btdev_scaned.xml` | 可用设备条目 |
### 阶段 8:Launcher/SystemUI 联动
需要纳入最终验收,而不是蓝牙 App 做完就结束。
Launcher:
- 蓝牙电话卡片显示连接/未连接
- 蓝牙音乐卡片显示播放状态
- 点击卡片打开正确 App
SystemUI:
- 状态栏蓝牙图标显示已连接/未连接
- 下拉快捷蓝牙开关可打开/关闭
- 快捷开关状态和蓝牙 App 状态一致
涉及文件:
| 文件 | 说明 |
|---|---|
| `YX_Launcher\src\main\res\layout\card_bluetooth.xml` | 蓝牙电话卡片 |
| `YX_Launcher\src\main\res\layout\card_bluetoothmusic.xml` | 蓝牙音乐卡片 |
| `YX_Launcher\src\main\java\com\yaxon\launcher\card\BluetoothCardView.java` | 蓝牙卡片 |
| `YX_Launcher\src\main\java\com\yaxon\launcher\card\BluetoothMusicCardView.java` | 蓝牙音乐卡片 |
| `YX_SystemUI` | 状态栏和快捷开关 |
## 5. 关键风险
| 风险 | 说明 | 建议 |
|---|---|---|
| UI 入口结构不一致 | 新项目入口结构和旧项目不同 | 先确认四项左侧菜单是否必须恢复 |
| 蓝牙音乐双入口 | `YX_BtMusic` 和 `BluetoothMusicActivity` 并存 | 统一入口和状态来源 |
| 设置形态不一致 | 截图是页面式,新项目是弹窗式 | 先确认产品要求 |
| 三方通话复杂 | 依赖手机、协议栈、平台实现 | 单独实测 |
| PBAP 授权 | 手机可能未授权联系人/通话记录 | 做未授权和同步失败提示 |
| SystemUI 状态同步 | 蓝牙开关和连接状态可能不同步 | 最后做系统级联动验收 |
| 旧项目编码/架构老 | 直接搬代码风险高 | 只抽业务行为 |
## 6. 开发验收清单
### 6.1 蓝牙拨号
- 输入号码显示正确
- 删除号码正确
- 点击拨号进入拨出页
- 未连接时不拨号并提示
- 联系人匹配显示正确
### 6.2 通话流程
- 来电可接听
- 来电可拒接
- 拨出可挂断
- 通话中可挂断
- 通话中计时正确
- 静音可切换
- 车机/手机音频可切换
- DTMF 可发送
### 6.3 三方通话
- 第二路来电能显示
- 第二路来电可拒接
- 第二路来电可接听
- 当前通话可保持
- 当前通话可释放并接听另一通
- held/active 状态显示正确
### 6.4 联系人
- 未同步状态正确
- 同步中状态正确
- 同步成功列表正确
- 同步失败提示正确
- 搜索正确
- 重新下载弹窗正确
- 点击联系人拨号正确
### 6.5 通话记录
- 未同步状态正确
- 同步中状态正确
- 暂无记录状态正确
- 记录列表正确
- 记录类型图标正确
- 点击记录拨号正确
### 6.6 蓝牙音乐
- 未连接状态正确
- 播放/暂停正确
- 上一首/下一首正确
- 标题/歌手/封面正确
- 进度/总时长正确
- 手机端状态变化能同步
### 6.7 蓝牙设置
- 蓝牙开关正确
- 蓝牙名称显示正确
- 蓝牙名称可修改
- 已配对设备列表正确
- 可用设备扫描正确
- 连接/断开正确
- 连接失败/超时提示正确
- 自动接听生效
### 6.8 系统联动
- 桌面蓝牙卡片状态正确
- 桌面蓝牙音乐卡片状态正确
- 状态栏蓝牙图标正确
- 下拉快捷蓝牙开关正确
- 开机后蓝牙服务正常启动
## 7. 建议下一步
下一步不要直接改代码,建议先输出两份更细文档:
1. `蓝牙页面资产清单`
- 页面
- 弹窗
- 图标
- 按钮
- 空状态
- 加载状态
- 错误状态
2. `蓝牙新旧功能缺口表`
- 老项目能力
- 新项目现状
- 缺口
- 影响文件
- 优先级
- 验收方式
确认后再进入代码开发。
## 8. 开发前必须确认
进入代码修改前,需要再次确认:
1. 是否备份。
2. 是否要求 UI 像素级复刻截图。
3. 蓝牙音乐入口以哪个模块为准。
4. 蓝牙设置使用页面式还是弹窗式。
5. 是否必须覆盖方向盘、语音、ITS/EasyConn 外部控制。