Files
Obsidian/项目文档/同力/蓝牙/蓝牙业务迁移梳理_2026-07-09.md
T

430 lines
14 KiB
Markdown
Raw Normal View History

2026-11-05 14:35:04 +08:00
# 蓝牙业务迁移梳理
日期: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. 重要提醒
进入开发阶段前,需要再次确认是否备份。
当前文档只是梳理,不代表已经完成代码修改。