Skip to content

CarPToCarL 1.2.1 — 靠近车机自动启动 + 通话音频通道

Choose a tag to compare

@jjuugk jjuugk released this 30 Oct 06:10
· 143 commits to main since this release

CarPToCarL 1.2.1 — 靠近车机自动启动 + 通话音频通道

versionCode 10201。本版两个主项:车机靠近就自动拉起并建链、通话音频通路。

覆盖安装即可(签名与 1.0.0 起各版一致),无需卸载。

一、靠近车机自动启动

不用再手动打开 App、手动点「启动连接」。车机进入范围后会自己回连手机蓝牙,系统随即投递 ACL 连接事件,本版据此自动完成「打开 App → 开始连接」。

为什么不用扫描:主动 startDiscovery 会持续占用射频、弹系统提示、还要额外的扫描权限,与「静默」相悖。车机本来就会自己回连,只听系统已经在投递的事件即可——不扫描、不轮询、无常驻服务、无常驻通知。

怎么保证抢在前面:广播到达后按「抢前台 → 抢链路 → 写日志」排序——

  1. 立刻 startActivity(拉界面是最慢的一环,越早排队越好,其余动作不阻塞它);
  2. 紧接着不等界面直接发起连接,只依赖已缓存的蓝牙地址,不做任何磁盘/网络准备;
  3. 最后才写文件日志,磁盘 IO 不拖慢前两步。

防误触发:

  • 未指定「目标车机」时一律不动(不会误连耳机、手表、测试台);
  • 同一段靠近 90 秒内只触发一次;地址比对不区分大小写;
  • 手动「断开/取消」后置抑制位,避免「断开 → 车机回连 → 又被拉起」的死循环;蓝牙链路真断(人离开/熄火)时自动解除。

需要你做一步:到「蓝牙配对」里把车机设为目标车机,否则按设计不会触发(这是故意的)。另外荣耀/华为系 ROM 若禁止本应用「自启动」,系统不会为广播拉起进程,功能会静默失效——界面在电池优化未豁免时会提示一次,按提示放行即可。

二、通话音频通道

通话在车机上没声音的结构性原因:audioType 只在 SETUP 里出现一次,而车机把 media 与 telephony 当成两台不同的输出设备。媒体流一直占着媒体通路,通话通路从来没有被打开过——调音量、补同步包都不可能修好。

  • AudioProfile 增输入档(麦克风上行);下行档 key 保持历史格式,音频档位记忆不失效
  • AirPlayClient:从 /info 的 telephony 档生成候选(AAC 优先、102 先于 100);应答改为按 streamConnectionID 认流——多流并存时按 type 会取到上一条流的 dataPort
  • SessionController:媒体 ↔ 通话换流(先建新、成功后停旧、补 RECORD);通话看门狗改双向 + 2 秒防抖 + 跟随 audioSender 字段(换流后不重启线程)
  • VirtualIap2Link:0x4154 订阅应答改用真实通话状态(原先恒报无通话),通话档上线后主动补推 0x4155

限制(已写入 docs/audio-call-issues.md):普通 App 抓不到通话双方音频(AudioPlaybackCapture 不允许 VOICE_COMMUNICATION,VOICE_CALL 需系统签名),所以本版只做到协议层与通路;麦克风上行只生成候选并打日志,端口/密钥方向待车机日志确认。

验证

  • 单测 250 例全绿:新增 CarApproachPolicyTest(10 例,守住「不误触发/不重复触发」)、AudioProfileKeyTest(守住档位 key 的历史格式,记忆不失效)
  • 蓝牙路径真机跑通:日志可见 APPROACH: 检测到目标车机蓝牙靠近,App 已被自动拉起 → AUTOCONNECT 接管并开始连接
  • 通话通路需实车确认,本版只保证协议与换流逻辑

分支说明

本版从 main 构建。bieke 分支已并入本版全部内容,另含别克 E5(B233/E2LB)建链、0x4300 报文体形态阶梯修复、链路层 DETECT 心跳,属实验线,不在本 Release 内。