Repository navigation
CarPToCarL 1.2.6 — 靠近车机自动拉起并自动连接
靠近车机,自动拉起、自动连接(本版重点)
上车不用再掏手机。车机进入范围后会自己回连手机蓝牙,系统随即发出 ACL_CONNECTED 广播——本版就在这一刻把 App 拉到前台并自动发起连接。
检测是静默的:不扫描、不轮询、无常驻服务。接收器在清单里静态注册,App 没打开、进程没起来也能收到这条广播(系统投递时会拉起进程)。
一条完整闭环
| 阶段 | 行为 |
|---|---|
| 命中 | 目标车机 ACL 连上就触发;非目标设备(耳机/手表)静默忽略 |
| 拉起 | 把界面带到前台,带标记让前台重新武装「启动后自动连接」 |
| 连接 | 前台走完整流程:权限门禁 → 蓝牙监听 → 等车机回连 → 会话 |
| 可见 | 常驻通知显示当前阶段(已出画面 / 正在连 / 等待车机下发),带「断开」按钮 |
| 收摊 | 车机断开满 30 秒 / 通知栏断开 / 划掉最近任务 → 结束会话、清通知、退出进程 |
为什么必须「拉到前台」而不是后台直连
1.2.0 最初在后台直接起连接:RFCOMM 能建、握手能过,但车机端收不到任何数据。整条管线不只是 iAP2 拨号——CarLife 劫持、虚拟屏与编码器、启动自检、权限门禁全挂在 Activity 上,绕开界面就是「握手成功、出流失败」。所以现在接收器只负责把 App 叫到前台,连接交给前台。
三个开关(首页「连接准备」)
- 靠近车机自动启动(默认开):命中目标车机时自动拉起并连接
- 触发后不弹出界面(默认关):界面建好后 1.2 秒退到后台,进度与「断开」都在通知栏
- 启动后自动连接(默认开):冷启动即自动发起连接
未指定「目标车机」时本功能完全不动作,避免连到耳机、手表或别人的手机。
其它改动
- 通知栏升级:从「运行中」改为跟随会话阶段刷新(每 3 秒),新增「断开」动作;换用新通道,避免旧通道被系统折叠进静默通知
- 后台启动被拦兜底:Android 10+ 静默拒绝后台启动界面(不报错、界面就是不出现)。拉起后 3.5 秒核对一次,没起来就发通知说清原因并给「打开界面」;首页新增「显示在其他应用上层」授权引导
- 远离 30 秒自动收摊:结束会话 → 停保活服务 → 清通知 → 退出进程,不再让手机替一辆不在跟前的车保持常亮。判定用「画面是否真在推」而不是「会话是否存在」——后者在等车机回连时长期为 true,会让收摊永不触发
- 划掉最近任务也收摊:此前只销毁界面,前台服务照跑、通知照挂
- 「刚断开过」抑制加 10 分钟时限:原先只在蓝牙断开时清除,可人在车上关掉 App 后蓝牙一直连着、永远等不到断开事件,标记永久挂住,人在车里却再也唤不醒。现在窗口外自然失效,主动打开 App 也立刻清除
- 单元测试:260 例通过(新增触发判定、抑制窗口、收摊判定三组)
安装
下载 CarPToCarL-1.2.6.apk 覆盖安装即可(versionCode 10206,可直接覆盖旧版)。CarPToCarL-latest.apk 与它内容一致,保留这个固定名字方便直接取最新版。
首次使用需要给三个权限
- 显示在其他应用上层——不给的话,系统会静默拦掉「后台打开界面」,靠近时什么都不会发生
- 忽略电池优化——否则进程可能被提前回收,广播投递不及时
- 自启动 / 关联启动(部分 ROM,如荣耀/华为)——关掉的话广播根本投不到本应用
前两项在首页「连接准备」里有引导入口;第三项需到系统设置里手动开。