# 蓝牙开发实施方案 日期: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 外部控制。