Files
Obsidian/项目文档/同力/蓝牙/蓝牙业务迁移梳理_2026-07-09.md
2026-11-05 14:35:04 +08:00

431 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 蓝牙业务迁移梳理
日期:2026-07-09
## 1. 背景
目标是让新项目 `F:\zdCode\tongli` 的蓝牙业务交互、需求和 UI,与旧项目 `F:\zdCode\tongli_old` 保持一致。
用户强调:
```text
业务逻辑一样,代码可以不参考。
```
因此本次迁移不能只看代码能不能跑,而要按旧项目和截图确认:
- 用户入口是否一致
- 页面结构是否一致
- 操作路径是否一致
- 空状态/加载状态/错误状态是否一致
- 通话状态机是否一致
- 蓝牙音乐、设置、桌面卡片、状态栏是否联动一致
## 2. 已确认截图范围
截图里覆盖了以下 UI 和业务状态:
| 模块 | 页面/状态 |
|---|---|
| 蓝牙拨号 | 左侧菜单、数字键盘、拨号按钮、右侧通话记录列表 |
| 通话记录 | 正常列表、暂无记录、未同步、一键同步、正在同步 |
| 联系人 | 联系人列表、搜索、下载/同步、重新下载联系人弹窗 |
| 通话态 | 来电中、正在拨号、通话中、通话中键盘 |
| 三方通话 | 第二路来电、保持中、三方通话中 |
| 蓝牙音乐 | 歌曲信息、封面、进度、上一首、播放/暂停、下一首 |
| 蓝牙设置 | 自动接听、蓝牙开关、蓝牙名称、已配对设备、可用设备、修改名称 |
| 桌面联动 | 蓝牙电话卡片、蓝牙音乐卡片、状态栏蓝牙状态 |
## 3. 旧项目业务基线
旧项目路径:
```text
F:\zdCode\tongli_old
```
旧蓝牙模块:
```text
F:\zdCode\tongli_old\YX_BlueTooth
```
旧项目主入口:
```text
F:\zdCode\tongli_old\YX_BlueTooth\src\main\java\com\yaxon\bluetooth\main\MainActivity.java
```
旧项目四个一级入口:
| Tab | 常量 | 业务 |
|---|---|---|
| 蓝牙拨号 | `TAB_KEYBOARD = 0` | 数字拨号、拨出电话 |
| 联系人 | `TAB_PHONEBOOK = 1` | 联系人列表、搜索、同步 |
| 蓝牙音乐 | `TAB_BLUETOOTHMUSIC = 2` | A2DP/AVRCP 音乐播放 |
| 蓝牙设置 | `TAB_SETTING = 3` | 蓝牙开关、名称、配对、扫描 |
| 通话记录 | `TAB_PHONERECORD = 4` | 通话记录列表和分类 |
旧项目 Manifest 关键入口:
| 类型 | 名称 |
|---|---|
| 主界面 | `MainActivity` |
| 通话界面 | `PhoningActivity` |
| 语音/外部控制 | `VoiceSwitchReceiver`、`VoiceRecognizeReceiver`、`ExternalControlReceiver` |
| 蓝牙音乐控制 | `BluetoothMusicReceiver` |
| 联系人数据 | `BluetoothPhonebookProvider` |
旧通话状态:
| 常量 | 值 | 含义 |
|---|---:|---|
| `STATUS_ACTIVE` | 0 | 通话中 |
| `STATUS_HELD` | 1 | 保持中 |
| `STATUS_DIALING` | 2 | 正在拨号 |
| `STATUS_ALERTING` | 3 | 对方振铃 |
| `STATUS_INCOMING` | 4 | 来电 |
| `STATUS_WAITING` | 5 | 等待来电/三方来电 |
旧通话动作:
- 拨号
- 挂断
- 接听
- 拒接
- 麦克风静音
- 车机/手机音频切换
- DTMF 小键盘
- 三方增强通话控制
旧联系人/通话记录能力:
- 联系人同步
- 重新下载联系人确认弹窗
- 联系人搜索
- 通话记录同步
- 通话记录分类:全部、拨出、已接、未接
- 点击联系人/通话记录拨号
旧音乐能力:
- 标题
- 歌手
- 时长
- 当前进度
- 上一首
- 播放/暂停
- 下一首
旧设置能力:
- 自动接听
- 蓝牙开关
- 蓝牙名称
- 已配对设备
- 附近/可用设备
- 搜索设备
- 连接/断开/删除设备
## 4. 新项目承接点
新项目路径:
```text
F:\zdCode\tongli
```
### 4.1 蓝牙电话 App
模块:
```text
F:\zdCode\tongli\YX_BlueTooth
```
关键文件:
| 文件 | 作用 |
|---|---|
| `YX_BlueTooth\src\main\AndroidManifest.xml` | 蓝牙电话模块入口 |
| `YX_BlueTooth\src\main\java\com\yaxon\bluetooth\main\MainActivity.java` | 主拨号/通话记录/联系人页面 |
| `YX_BlueTooth\src\main\java\com\yaxon\bluetooth\main\BluetoothPhoneActivity.java` | 通话界面 |
| `YX_BlueTooth\src\main\java\com\yaxon\bluetooth\fragment\CallLogsFragment.java` | 通话记录 |
| `YX_BlueTooth\src\main\java\com\yaxon\bluetooth\fragment\ContactsFragment.java` | 联系人 |
| `YX_BlueTooth\src\main\java\com\yaxon\bluetooth\dialog\BtSettingDialog.java` | 蓝牙设置弹窗 |
| `YX_BlueTooth\src\main\java\com\yaxon\bluetooth\service\BluetoothService.java` | 后台服务和来电窗口联动 |
新项目主界面当前 Tab:
| Tab | 常量 | 当前业务 |
|---|---|---|
| 通话记录 | `TAB_CALL_LOGS = 0` | 右侧通话记录 |
| 联系人 | `TAB_CONTACTS = 1` | 右侧通讯录 |
| 拨号键盘 | `TAB_KEYBOARD = 2` | 左侧拨号键盘 |
说明:
新项目主界面已经不是旧项目四个一级 Tab 结构,而是左侧拨号键盘 + 右侧通话记录/联系人切换。后续要确认 UI 是否必须完全恢复旧截图里的左侧菜单结构:
```text
蓝牙拨号 / 联系人 / 蓝牙音乐 / 蓝牙设置
```
### 4.2 通话状态
新项目通话状态:
| 新常量 | 值 | 对应旧状态 |
|---|---:|---|
| `CALL_STATE_ACTIVE` | 0 | `STATUS_ACTIVE` |
| `CALL_STATE_HELD` | 1 | `STATUS_HELD` |
| `CALL_STATE_DIALING` | 2 | `STATUS_DIALING` |
| `CALL_STATE_ALERTING` | 3 | `STATUS_ALERTING` |
| `CALL_STATE_INCOMING` | 4 | `STATUS_INCOMING` |
| `CALL_STATE_WAITING` | 5 | `STATUS_WAITING` |
| `CALL_STATE_TERMINATED` | 7 | 旧项目无显式同名常量,表示结束 |
关键承接文件:
| 文件 | 作用 |
|---|---|
| `BluetoothPhoneActivity.java` | 全屏通话界面 |
| `BluetoothPhoneViewModel.java` | 通话状态和动作控制 |
| `TelephoneWindowControl.java` | 通话窗口控制 |
| `ThirdCallingControl.java` | 三方通话/等待来电控制 |
| `ThirdCallControlView.java` | 三方通话控制视图 |
### 4.3 蓝牙 SDK
模块:
```text
F:\zdCode\tongli\YX_BluetoothSDK
```
关键管理类:
| 类 | 作用 |
|---|---|
| `BtPhoneManager` | HFP 电话状态管理 |
| `BtContactsManager` | 联系人/PBAP |
| `BtCallRecordsManager` | 通话记录 |
| `BtMusicManager` | 蓝牙音乐 |
| `BtSettingManager` | 蓝牙开关、名称、设备状态 |
| `BtInfoPushManager` | 状态推送 |
| `BtVoiceManager` | 语音控制 |
关键控制类:
| 类 | 作用 |
|---|---|
| `BtPhoneControlManager` | 拨号、接听、挂断、拒接、DTMF 等 |
| `BtContactsControlManager` | 联系人控制 |
| `BtCallRecordsControlManager` | 通话记录控制 |
| `BtMusicControlManager` | 播放、暂停、上一首、下一首 |
| `BtSettingControlManager` | 蓝牙开关、连接、断开、配对 |
| `BtPairedControlManager` | 已配对设备 |
结论:新平台应优先使用 SDK 的 manager/control manager,不建议搬旧项目底层实现。
### 4.4 蓝牙音乐
新项目有两个承接点:
| 模块 | 文件 | 说明 |
|---|---|---|
| `YX_BtMusic` | `YX_BtMusic\src\main\java\com\yaxon\btmusic\main\MainActivity.java` | 独立蓝牙音乐 App |
| `YX_BlueTooth` | `YX_BlueTooth\src\main\java\com\yaxon\bluetooth\main\BluetoothMusicActivity.java` | 蓝牙电话模块内也存在音乐 Activity |
当前需要确认:
```text
点击截图左侧“蓝牙音乐”时,是在蓝牙 App 内切换,还是跳转独立 YX_BtMusic?
```
### 4.5 Launcher / SystemUI 联动
桌面卡片:
| 文件 | 作用 |
|---|---|
| `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` | 状态栏蓝牙图标、快捷开关 |
| `YX_SystemUISDK` | SystemUI 控制器 |
需要验收:
- 蓝牙开关状态是否同步到下拉快捷栏。
- 已连接/未连接状态是否同步到桌面卡片。
- 蓝牙音乐播放状态是否同步到桌面音乐卡片。
## 5. 业务交互基线表
| 模块 | 页面/状态 | 用户动作 | 期望结果 | 新项目承接 | 风险 |
|---|---|---|---|---|---|
| 蓝牙拨号 | 数字键盘 | 点击数字 | 输入框追加号码 | `MainActivity` + `KeyBoardView` | UI 结构需对齐截图 |
| 蓝牙拨号 | 删除号码 | 点击删除 | 删除最后一位 | `KeyBoardView` | 长按清空是否支持待查 |
| 蓝牙拨号 | 发起呼叫 | 点击绿色拨号 | 进入正在拨号页 | `BtPhoneControlManager` / `BluetoothPhoneActivity` | 未连接时提示需统一 |
| 通话记录 | 正常列表 | 点击记录 | 使用该号码拨号 | `CallLogsFragment` | 记录合并/分类需验收 |
| 通话记录 | 暂无记录 | 无记录 | 显示暂无记录 | `CallLogsFragment` | 空状态文案/图标需对齐 |
| 通话记录 | 未同步 | 未下载记录 | 显示一键同步 | `CallHistoryViewModel` | 是否自动同步需确认 |
| 通话记录 | 正在同步 | 点击同步 | 显示同步中 | `CallLogsFragment` | 超时/失败状态需补齐 |
| 联系人 | 正常列表 | 点击联系人 | 拨打联系人号码 | `ContactsFragment` | 多号码联系人行为待确认 |
| 联系人 | 搜索 | 输入关键字 | 按名称/号码/拼音搜索 | `ContactListViewModel` | 需验中文、拼音、数字 |
| 联系人 | 重新下载 | 点击下载图标 | 弹出确认框 | `ContactsFragment` | 弹窗样式需对齐截图 |
| 来电 | 来电中 | 接听 | 进入通话中 | `BluetoothPhoneActivity` | 倒车/AVM 场景窗口策略需验收 |
| 来电 | 来电中 | 拒接 | 结束来电 | `BluetoothPhoneViewModel` | 单路/三方状态不同 |
| 拨出 | 正在拨号 | 挂断 | 结束拨号 | `BluetoothPhoneActivity` | alerting/dialing 显示需统一 |
| 通话中 | 静音 | 点击麦克风 | 麦克风静音/取消静音 | `BluetoothPhoneViewModel` | 状态图标需对齐 |
| 通话中 | 音频切换 | 点击车机/手机 | SCO 在车机/手机间切换 | `BluetoothPhoneViewModel` | 需实车或蓝牙设备验证 |
| 通话中 | DTMF | 打开小键盘 | 发送 DTMF 按键 | `BluetoothPhoneViewModel` | DTMF 兼容性需验收 |
| 三方通话 | 第二路来电 | 接听/拒接/保持 | 状态正确切换 | `ThirdCallingControl` | 高风险,必须实测 |
| 蓝牙音乐 | 播放页 | 播放/暂停 | AVRCP 控制手机音乐 | `BtMusicViewModel` | 有两个音乐 Activity,入口需确认 |
| 蓝牙音乐 | 歌曲信息 | 手机切歌 | 标题/歌手/进度刷新 | `BtMusicControlManager` | 部分手机元数据为空 |
| 蓝牙设置 | 蓝牙开关 | 打开/关闭 | 蓝牙状态变化 | `BtSettingDialog` | 截图是页面式,当前是弹窗式 |
| 蓝牙设置 | 修改名称 | 输入新名称 | 本机蓝牙名更新 | `BtSettingViewModel` | 修改名称入口需对齐 |
| 蓝牙设置 | 可用设备 | 搜索/点击设备 | 配对或连接 | `BtSettingViewModel` | 连接超时/失败提示需统一 |
| 桌面卡片 | 蓝牙电话卡片 | 点击卡片 | 进入蓝牙电话 | `BluetoothCardView` | 状态同步需验收 |
| 桌面卡片 | 蓝牙音乐卡片 | 点击卡片 | 进入蓝牙音乐 | `BluetoothMusicCardView` | 包名/入口需确认 |
| 状态栏 | 快捷蓝牙 | 点击开关 | 打开/关闭蓝牙 | `YX_SystemUI` | 与蓝牙 App 状态需同步 |
## 6. 当前初步缺口
### 6.1 入口结构缺口
旧项目左侧一级入口是:
```text
蓝牙拨号 / 联系人 / 蓝牙音乐 / 蓝牙设置
```
新项目主界面当前更像:
```text
拨号键盘 + 通话记录/通讯录二级切换
```
要确认是否需要把新项目 UI 改回截图结构,至少视觉上应保持一致。
### 6.2 设置形态缺口
截图里的蓝牙设置是完整页面区域:
- 自动接听
- 蓝牙开关
- 蓝牙名称
- 已配对设备
- 可用设备
新项目目前主要是 `BtSettingDialog` 弹窗式承接。
需要确认:
```text
设置必须做成截图里的完整页面,还是弹窗也可接受?
```
### 6.3 蓝牙音乐入口缺口
新项目同时存在:
- `YX_BtMusic`
- `YX_BlueTooth\BluetoothMusicActivity`
必须统一入口和状态来源,避免一个入口播放状态正常,另一个入口不同步。
### 6.4 三方通话高风险
三方通话是最容易出现状态错乱的地方:
- 单路来电
- 通话中第二路来电
- 一路保持一路激活
- 接听第二路并挂断第一路
- 挂断当前保留保持中通话
这一块必须实测,不能只靠 UI 静态对齐。
## 7. 建议开发顺序
### 第一阶段:冻结需求和页面资产
输出并确认:
- 页面清单
- 弹窗清单
- 图标清单
- 状态清单
- 入口跳转清单
- Launcher/SystemUI 联动清单
### 第二阶段:主流程 UI 对齐
优先对齐:
1. 蓝牙拨号
2. 通话记录
3. 联系人
4. 来电/拨号/通话中
### 第三阶段:高风险业务对齐
重点处理:
1. 三方通话
2. 联系人/通话记录同步状态
3. 蓝牙设置设备连接状态
4. 蓝牙音乐播放状态同步
### 第四阶段:系统级联动
验证:
1. 桌面蓝牙电话卡片
2. 桌面蓝牙音乐卡片
3. 状态栏蓝牙图标
4. 下拉快捷蓝牙开关
5. 开机自启动服务
## 8. 明天继续时优先做什么
建议下一步直接做两件事:
1. 输出《蓝牙页面资产清单》
- 页面
- 弹窗
- 空状态
- 加载状态
- 错误状态
- 按钮状态
- 图标状态
2. 输出《新旧项目功能缺口表》
- 已具备,需验收
- 已具备,但 UI 不一致
- 业务可能缺失
- 高风险必须实测
- 可以延后处理
## 9. 后续开发前需要确认的问题
1. 新项目蓝牙主界面是否必须恢复旧截图的四个左侧入口?
2. 蓝牙设置是做完整页面,还是保留当前弹窗式?
3. 蓝牙音乐入口以 `YX_BtMusic` 为准,还是以 `YX_BlueTooth\BluetoothMusicActivity` 为准?
4. 是否需要完全复刻截图背景、图标和尺寸,还是只对齐交互和业务?
5. 是否需要兼容方向盘按键、语音控制、ITS/EasyConn 外部控制?
## 10. 重要提醒
进入开发阶段前,需要再次确认是否备份。
当前文档只是梳理,不代表已经完成代码修改。