# Codex Xugong ## Workspace - Root: `D:\zdCode\xugong` - Project type: multi-module Android project - Main module registry: `settings.gradle` ## Fast Start 下次进入这个项目,优先按下面顺序建立上下文,不需要全仓扫描。 1. 先确认当前任务目标 2. 再定位相关模块 3. 只沿调用链读取必要代码 4. 需要修改时,再扩展到相邻模块 推荐开场信息: ```text 继续处理 xugong 项目 当前问题:<一句话描述> 相关模块:<模块名列表> 已知结论:<如果有,写 1-3 句> ``` 示例: ```text 继续处理 xugong 项目的蓝牙通讯录重复同步问题 相关模块:YX_Voice / YX_BluetoothSDK / YX_BlueTooth 已知结论:syncBtPhoneContactStatus 在连接成功后和 PBAP 通讯录下载完成后各发送了一次 ``` ## Module Heuristics 当前仓库很大,但常见问题可先按职责收敛: - `YX_Voice`: 语音协议、事件上报、蓝牙状态同步到语音侧 - `YX_BluetoothSDK`: 蓝牙协议、PBAP、联系人/通话记录同步 - `YX_BlueTooth`: 蓝牙业务 UI、ViewModel、页面触发入口 - `YX_Lib_CommonBase`: 常量、公共协议字段 如果问题和蓝牙联系人同步有关,默认先看: - `YX_Voice/src/main/java/com/yaxon/voice/helper/VoiceEventHelper.java` - `YX_Voice/src/main/java/com/yaxon/voice/protocol/YxProtocol.java` - `YX_Voice/src/main/java/com/yaxon/voice/receiver/BluetoothMonitorReceiver.java` - `YX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/modules/BtContactsManager.java` - `YX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/platform/BluetoothPbapClient.java` ## Current Topic ### Issue 日志文件: - `C:\Users\Administrator\Desktop\徐工日志\yx_log\2026_0513_1747_33_545.log` 问题: - 打开蓝牙并连接手机后,`syncBtPhoneContactStatus` 发送了 2 次 ### Current Conclusion `syncBtPhoneContactStatus` 的两次发送不是单纯由“蓝牙打开”触发,而是两段不同链路: 1. 蓝牙连接成功后立即上报一次当前联系人 2. 首次连接触发 PBAP 通讯录下载,下载完成后再次上报一次 关键日志时间点: - `2026-05-13 17:48:07.393` 第一次发送 `syncBtPhoneContactStatus` - `2026-05-13 17:48:13.662` `BtContactsManager` 触发 `phoneBookPullRequest` - `2026-05-13 17:48:14.270` 第二次发送 `syncBtPhoneContactStatus` ### Relevant Code Paths 当前已确认的主要入口: - `YX_Voice/.../YxProtocol.java` - `BLUETOOTH_CONNECT_STATUS` 中调用 `VoiceManager.VOICE_EVENT_HELPER.notifyContact()` - `YX_Voice/.../BluetoothMonitorReceiver.java` - `ACTION_CONTACTS_DOWNLOAD_COMPLETE` 中调用 `VoiceManager.VOICE_EVENT_HELPER.notifyContact()` - `YX_Voice/.../VoiceEventHelper.java` - `initNotifyBluetoothStatus()` 中会补发一次 `notifyContact()` 联系人下载链路: - `BtContactsManager.onPbabStatusChanged(...)` - `BluetoothPbapClient.phoneBookPullRequest(...)` - `ContactUtils.getAllContacts(...)` - 完成后回到语音侧再触发联系人同步 ## Suggested Fix 优先按“数据就绪事件”而不是“连接事件”驱动联系人同步。 建议顺序: 1. 去掉连接成功后立即 `notifyContact()` 的路径 2. 保留 PBAP 下载完成后的联系人同步 3. 保留显式查询联系人时的主动同步 4. 给 `notifyContact()` 增加幂等保护 推荐幂等键: - `activeDeviceMac` - `contactJson` 的 hash 推荐规则: - 同一 `mac` - 同一份联系人内容 则跳过重复发送 `syncBtPhoneContactStatus` ### Minimal Safe Change 如果只做最小改动,先改这一条: - 删除 `YxProtocol.BLUETOOTH_CONNECT_STATUS` 里的 `notifyContact()` 保留: - PBAP 下载完成广播触发的 `notifyContact()` - 手动查询联系人时触发的 `notifyContact()` 同时把初始化补发改成带条件: - 仅当当前已连接 - 且本地已有该 `mac` 的联系人缓存 才补发联系人 ## Re-entry Notes 如果下次关闭终端后重新进入,直接: ```powershell cd D:\zdCode\xugong ``` 然后对 Codex 说: ```text 按 codex_xugong.md 继续 ``` 或者补一句: ```text 按 codex_xugong.md 继续,开始改蓝牙联系人重复同步 ``` ## Session Log ### 2026-05-13 当前分析聚焦在“蓝牙联系人同步到语音侧”的链路。 #### Logs Conclusion 日志文件: - `C:\Users\Administrator\Desktop\徐工日志\yx_log\2026_0513_1747_33_545.log` 结论: - `syncBtPhoneContactStatus` 确实发送了 2 次 - 不是单纯“蓝牙打开”导致 2 次 - 实际是: 1. 蓝牙连接成功后先上报一次联系人 2. PBAP 通讯录下载完成后又上报一次联系人 #### Uncommitted Code Review 已分析当前工作区未提交改动,重点文件: - `YX_Voice/src/main/java/com/yaxon/voice/helper/ContactHelper.java` - `YX_Voice/src/main/java/com/yaxon/voice/helper/VoiceEventHelper.java` - `YX_Voice/src/main/java/com/yaxon/voice/protocol/BluetoothProtocol.java` - `YX_Voice/src/main/java/com/yaxon/voice/helper/BlueToothHelper.java` - `YX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/modules/BtSettingManager.java` - `YX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/modules/BtContactsManager.java` - `YX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/modules/BtVoiceManager.java` 当前未提交改动的主要目的: - 修复“切换不同手机后,把多个手机的通讯录一起同步给语音侧”的问题 当前结论: 1. 这次改动的主方向是对的 2. 关键修复已经落在“按当前活动设备 `macAddress` 过滤联系人” 3. `notifyContact()` 不再直接读全量蓝牙联系人,而是: - 先取 `activeDeviceMac` - 再调用 `getContactsNew(macAddress)` 4. `ContactHelper.getContactsNew(macAddress)` 已经对 `content://com.yaxon.bluetooth.contact/table_contacts` 加了: - `selection = "macAddress = ?"` - `selectionArgs = new String[]{macAddress}` 5. 数据表列名 `macAddress` 已核对,和 `YX_BluetoothSDK` 里的数据库定义一致 这意味着: - “多台手机联系人混发”的问题,当前未提交代码已经基本修住 #### Remaining Risks 这批改动还没有解决的点: 1. 仍可能对同一台手机重复同步 2 次联系人 - 连接成功一次 - PBAP 下载完成一次 2. `notifyContact()` 现在强依赖 `activeDeviceMac` - 如果某个时序里先触发 `notifyContact()` - 但语音侧还没收到 `cmd.syncBtActiveDeviceMac` - 这次同步会直接跳过,日志会打印 `notifyContact: no active device` #### Next Step 明天继续时,建议在当前基础上做这两件事: 1. 给 `notifyContact()` 增加幂等保护 - 去重键建议:`macAddress + contactJson/hash` 2. 收敛联系人同步触发时机 - 区分“连接事件” - 区分“PBAP 下载完成事件” - 避免同一份联系人重复发给语音侧 #### Resume Prompt 明天可直接输入: ```text 按 codex_xugong.md 继续,基于当前未提交代码继续处理蓝牙联系人同步去重 ```