我对领克这套车机的语音和播放器都不满意,最直接的原因是:听我自己的歌,还要我买它的会员。
所以我自己写了个车机版音乐 App,装进车里:曲库在我自己的服务器上,方向盘上的语音键说一句”播放稻香”,它就去我的曲库里找,然后放出来。

为什么不用原厂的
- 原厂那套播放器(亿咖通做的「随心听」)只认它自己的在线曲库。我那 1449 首在自建存储上的歌,它根本看不见。
- 语音助手是百度 DuerOS:说”播放稻香”,它会去云端搜,没登录先回你一句”请您先登录”;登录了,它放的还是它的曲库。
- 车机是 Android 4.4.3,而且是 user 版本、没有 root。能做的事情天生受限。
结论就是:指望原厂改,不如自己写一个。
车机的底细
先摸硬件和系统。领克 CS11,飞思卡尔 i.MX6,Android 4.4.3(API 19)。我把 MusicFree 那套曲库搬到车上,用原生 Java 写了个车机版:一个列表 Activity + 一个播放 Service,曲库在构建时从我的 MusicFree 插件里抽成 JSON 打进 APK。
4.4 有三个坑,全是踩过才记住的:
- 没有 MediaSession(那是 5.0 才有的东西)。方向盘上的媒体键走
ACTION_MEDIA_BUTTON广播 +RemoteControlClient,谁注册成”当前媒体客户端”,按键就发给谁。 MediaPlayer.setDataSource(路径)是让 mediaserver 进程去开这个文件(API 21 以后才改成 app 自己开好 fd 传过去)。app 私有目录默认 0700、文件 0600,mediaserver 连目录都进不去,直接报setDataSourceFD failed: status=0x80000000。把缓存目录设成 0755、缓存文件 0644 就通了。- 边下边播喂的是还没下完的
.part,4.4 的 AwesomePlayer 对太小的文件 sniff 不出格式,报的还是上面那个错。实测 300K 左右必挂、1.8M 正常,所以 4.4 上我把起播门槛抬到 1M(API 21+ 保持 512K 秒开)。
最难的一块:让语音听我的
我没打算重做语音识别——唤醒词、麦克风、降噪都在系统那套里,重做一遍不划算。我想要的只是”它听清之后,听我的”。
抓了一遍包,发现 DuerOS 把”播放稻香”变成了一条普通广播:
|
原厂随心听收这条、要登录、播不出来;我也注册同一个 action,拿到 query 去搜我自己的曲库——歌就放上了。
代价是:这是无序广播(有序=false),abortBroadcast() 挡不掉原厂那一份。所以最后靠的是抢音频焦点(它一开播我就抢回来)和把我的播放页顶到前台,把原厂那页压下去。
顺手把车上 77 个原厂 APK 全拉下来归档了。语音服务的 AIDL、车况接口、埋点上报都翻了一遍,也发现它其实留了”媒体应用自报能力”的正规接口——那是下一步的事。
顺手做的几件事
- 上电自动续播:车机启动会发
BOOT_COMPLETED/FIRST_BOOT_COMPLETED,我加了个 receiver 把播放服务拉起来,接着上次那首、上次的位置继续放(4G 没起来就先等网络,不然会被当成”放不了”直接跳歌)。 - 点播一律从头放:之前”续播位置”会漏到新点的那首歌上,听着很像鬼故事。
- 队列永远是整个曲库:搜索只是”找到这首歌”的入口,否则搜出来只有两三首,切歌只能在里面打转。
- 网络电台:525 个台,国家台、省市广播、网络电台都能听。
- 播放页:黑胶转起来、歌词跟上。
- 键盘党的优化(今天刚加):拼音首字母搜歌,打
ghsy出「光辉岁月」,回车直接放第一首,不用再去点列表。


边界在哪
- 车机没 root,
pm disable这类系统操作都做不了,所以对原厂应用我只能是”接管”,做不到”替换”。 - 远程开门、远程启动那条路我查到了,但没碰:这东西安全攸关,厂家也做了加密和签名,不值得也不该拿自己的车去试。
- 现在稳定能用的:语音点歌、上车自动续播、中文/拼音搜歌、方向盘切歌、离线缓存。
最后
这件事让我改了个看法:车机里很多东西不是做不到,是没人愿意为”你那点具体需求”去做。而当你有 AI 帮手、又有自己的一套服务(曲库、签名服务都在自己手里),”我不满意”和”我自己写一个”之间的距离,可能只有一个周末。
评论
0 条评论