14 KiB
14 KiB
蓝牙业务迁移梳理
日期:2026-07-09
1. 背景
目标是让新项目 F:\zdCode\tongli 的蓝牙业务交互、需求和 UI,与旧项目 F:\zdCode\tongli_old 保持一致。
用户强调:
业务逻辑一样,代码可以不参考。
因此本次迁移不能只看代码能不能跑,而要按旧项目和截图确认:
- 用户入口是否一致
- 页面结构是否一致
- 操作路径是否一致
- 空状态/加载状态/错误状态是否一致
- 通话状态机是否一致
- 蓝牙音乐、设置、桌面卡片、状态栏是否联动一致
2. 已确认截图范围
截图里覆盖了以下 UI 和业务状态:
| 模块 | 页面/状态 |
|---|---|
| 蓝牙拨号 | 左侧菜单、数字键盘、拨号按钮、右侧通话记录列表 |
| 通话记录 | 正常列表、暂无记录、未同步、一键同步、正在同步 |
| 联系人 | 联系人列表、搜索、下载/同步、重新下载联系人弹窗 |
| 通话态 | 来电中、正在拨号、通话中、通话中键盘 |
| 三方通话 | 第二路来电、保持中、三方通话中 |
| 蓝牙音乐 | 歌曲信息、封面、进度、上一首、播放/暂停、下一首 |
| 蓝牙设置 | 自动接听、蓝牙开关、蓝牙名称、已配对设备、可用设备、修改名称 |
| 桌面联动 | 蓝牙电话卡片、蓝牙音乐卡片、状态栏蓝牙状态 |
3. 旧项目业务基线
旧项目路径:
F:\zdCode\tongli_old
旧蓝牙模块:
F:\zdCode\tongli_old\YX_BlueTooth
旧项目主入口:
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. 新项目承接点
新项目路径:
F:\zdCode\tongli
4.1 蓝牙电话 App
模块:
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 是否必须完全恢复旧截图里的左侧菜单结构:
蓝牙拨号 / 联系人 / 蓝牙音乐 / 蓝牙设置
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
模块:
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 |
当前需要确认:
点击截图左侧“蓝牙音乐”时,是在蓝牙 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 入口结构缺口
旧项目左侧一级入口是:
蓝牙拨号 / 联系人 / 蓝牙音乐 / 蓝牙设置
新项目主界面当前更像:
拨号键盘 + 通话记录/通讯录二级切换
要确认是否需要把新项目 UI 改回截图结构,至少视觉上应保持一致。
6.2 设置形态缺口
截图里的蓝牙设置是完整页面区域:
- 自动接听
- 蓝牙开关
- 蓝牙名称
- 已配对设备
- 可用设备
新项目目前主要是 BtSettingDialog 弹窗式承接。
需要确认:
设置必须做成截图里的完整页面,还是弹窗也可接受?
6.3 蓝牙音乐入口缺口
新项目同时存在:
YX_BtMusicYX_BlueTooth\BluetoothMusicActivity
必须统一入口和状态来源,避免一个入口播放状态正常,另一个入口不同步。
6.4 三方通话高风险
三方通话是最容易出现状态错乱的地方:
- 单路来电
- 通话中第二路来电
- 一路保持一路激活
- 接听第二路并挂断第一路
- 挂断当前保留保持中通话
这一块必须实测,不能只靠 UI 静态对齐。
7. 建议开发顺序
第一阶段:冻结需求和页面资产
输出并确认:
- 页面清单
- 弹窗清单
- 图标清单
- 状态清单
- 入口跳转清单
- Launcher/SystemUI 联动清单
第二阶段:主流程 UI 对齐
优先对齐:
- 蓝牙拨号
- 通话记录
- 联系人
- 来电/拨号/通话中
第三阶段:高风险业务对齐
重点处理:
- 三方通话
- 联系人/通话记录同步状态
- 蓝牙设置设备连接状态
- 蓝牙音乐播放状态同步
第四阶段:系统级联动
验证:
- 桌面蓝牙电话卡片
- 桌面蓝牙音乐卡片
- 状态栏蓝牙图标
- 下拉快捷蓝牙开关
- 开机自启动服务
8. 明天继续时优先做什么
建议下一步直接做两件事:
-
输出《蓝牙页面资产清单》
- 页面
- 弹窗
- 空状态
- 加载状态
- 错误状态
- 按钮状态
- 图标状态
-
输出《新旧项目功能缺口表》
- 已具备,需验收
- 已具备,但 UI 不一致
- 业务可能缺失
- 高风险必须实测
- 可以延后处理
9. 后续开发前需要确认的问题
- 新项目蓝牙主界面是否必须恢复旧截图的四个左侧入口?
- 蓝牙设置是做完整页面,还是保留当前弹窗式?
- 蓝牙音乐入口以
YX_BtMusic为准,还是以YX_BlueTooth\BluetoothMusicActivity为准? - 是否需要完全复刻截图背景、图标和尺寸,还是只对齐交互和业务?
- 是否需要兼容方向盘按键、语音控制、ITS/EasyConn 外部控制?
10. 重要提醒
进入开发阶段前,需要再次确认是否备份。
当前文档只是梳理,不代表已经完成代码修改。