6、CarLibrary与车载API:Car API概览、CarSensorManager、CarInfoManager、CarProjectionManager
好,咱们今天聊点硬核的。CarLibrary,说白了就是Google给车载开发准备的那把钥匙。没有它,你连车机的门都摸不着。我刚开始接触Android Automotive时,第一反应是:这不就是个定制版Android吗?后来发现,还真不是这么回事。
车机跟手机最大的区别在哪?手机只管自己,车机得管一堆硬件——车窗、空调、方向盘按键、传感器。这些玩意儿,普通Android SDK根本管不着。所以Google搞了个CarLibrary,专门封装这些车载硬件接口。
核心要点:CarLibrary不是普通Android库,它是车机应用与车载硬件之间的桥梁。所有跟车相关的操作,都得通过它来干。
Car API概览:你手里有哪些牌?
Car API的架构其实挺清晰的。我把它分成三层:
- 核心层:Car类,所有操作的入口。你得先拿到Car对象,才能调用其他Manager。
- 管理层:各种Manager,比如CarSensorManager、CarInfoManager、CarProjectionManager。每个Manager管一摊事。
- 数据层:各种数据类,比如CarSensorEvent、CarInfo。这些是Manager返回给你的数据。
嗯,这里要注意:Car API不是所有车都支持。有些车可能没有某些传感器,或者车厂自己做了定制。我在项目中遇到过,同一套代码在不同车型上表现完全不一样。所以,写代码时一定要做兼容性检查。
CarSensorManager:让应用感知车辆状态
CarSensorManager,说白了就是让你知道车现在什么状态。车速多少?转速多少?油箱还有多少油?这些信息都归它管。
我个人习惯,在写导航类应用时,一定会先注册车速传感器。为什么?因为导航需要根据车速调整路线规划。你想想看,如果车都开到120了,导航还在推荐限速80的路,那不是坑人吗?
// 获取CarSensorManager
CarSensorManager sensorManager = (CarSensorManager) car.getCarManager(
android.car.Car.SENSOR_SERVICE
);
// 注册车速传感器监听
sensorManager.registerListener(
new CarSensorEventCallback() {
@Override
public void onSensorChanged(CarSensorEvent event) {
if (event.sensorType == CarSensorManager.SENSOR_TYPE_CAR_SPEED) {
float speed = event.getFloatValues()[0];
// 处理车速数据
Log.d("Speed", "当前车速: " + speed + " km/h");
}
}
},
CarSensorManager.SENSOR_TYPE_CAR_SPEED,
CarSensorManager.SENSOR_RATE_NORMAL
);
小提示:注册传感器监听时,速率别设太高。SENSOR_RATE_FAST虽然数据更新快,但耗电也快。我一般用SENSOR_RATE_NORMAL,够用就行。
CarSensorManager支持的传感器类型还挺多的。我列几个常用的:
| 传感器类型 | 说明 | 返回值 |
|---|---|---|
| SENSOR_TYPE_CAR_SPEED | 车速 | km/h |
| SENSOR_TYPE_RPM | 发动机转速 | rpm |
| SENSOR_TYPE_FUEL_LEVEL | 燃油量 | 百分比 |
| SENSOR_TYPE_ODOMETER | 里程表 | 公里 |
| SENSOR_TYPE_TIRE_PRESSURE | 胎压 | kPa |
注意:有些传感器数据可能受隐私保护限制。比如车速数据,在某些地区不允许第三方应用获取。我曾经踩过这个坑,应用在海外市场被拒了,就是因为没处理好隐私合规。
CarInfoManager:获取车辆基本信息
CarInfoManager管的是车辆的基本信息。比如品牌、型号、年份、VIN码这些。这些信息在应用适配时特别有用。
举个例子:不同品牌的车,方向盘按键布局不一样。你写一个音乐播放应用,需要知道用户按的是"上一曲"还是"音量加"。这时候,CarInfoManager就能帮你拿到车辆信息,然后你做针对性适配。
// 获取CarInfoManager
CarInfoManager infoManager = (CarInfoManager) car.getCarManager(
android.car.Car.INFO_SERVICE
);
// 获取车辆品牌
String manufacturer = infoManager.getManufacturer();
// 获取车辆型号
String model = infoManager.getModel();
// 获取生产年份
int year = infoManager.getYear();
Log.d("CarInfo", "车辆信息: " + manufacturer + " " + model + " " + year);
CarInfoManager还能拿到一些更细的信息,比如:
- 驱动类型:前驱、后驱、四驱
- 能源类型:燃油、电动、混动
- 车身类型:轿车、SUV、MPV
这些信息在写车机互联应用时特别有用。比如,电动车和燃油车的续航计算方式完全不同。你写一个充电桩查找应用,得先知道车是电动的还是燃油的,对吧?
CarProjectionManager:手机车机互联的核心
CarProjectionManager,这个才是咱们课程的重头戏。它负责管理手机和车机之间的投影连接。说白了,就是让手机应用能在车机上跑起来。
我记得第一次调通CarProjectionManager时,还挺激动的。手机上的导航画面,嗖的一下就投到车机屏幕上了。那种感觉,就像打通了任督二脉。
// 获取CarProjectionManager
CarProjectionManager projectionManager = (CarProjectionManager) car.getCarManager(
android.car.Car.PROJECTION_SERVICE
);
// 检查是否支持投影
if (projectionManager.isProjectionSupported()) {
// 启动投影
projectionManager.startProjection();
} else {
Log.w("Projection", "当前车辆不支持投影功能");
}
CarProjectionManager的核心功能有三个:
- 连接管理:管理手机和车机的连接状态。连接、断开、重连,都归它管。
- 屏幕投影:把手机屏幕内容投射到车机屏幕上。支持横竖屏自适应。
- 输入转发:把车机上的触摸、按键事件转发给手机应用。
关键点:CarProjectionManager只是提供了连接和投影的基础能力。真正的应用交互逻辑,还得靠你自己写。比如,怎么处理车机上的多点触控?怎么适配不同分辨率的车机屏幕?这些都需要你额外处理。
知识体系总览
说了这么多,咱们用一张图把整个CarLibrary的知识体系串起来。这样你脑子里能有个整体框架。
这张图把CarLibrary的核心脉络理清楚了。你写代码时,记住一个原则:先拿Car,再拿Manager,最后干活。顺序不能乱,少了哪一步都不行。
个人经验:刚开始用CarLibrary时,我总忘记检查Manager是否为null。有些车可能不支持某些Manager,直接调用会崩。后来我养成了习惯,每次获取Manager后都做一次null检查。这个习惯救了我好几次。
好了,这一章的内容就到这。CarLibrary是车机开发的基石,后面的所有内容都建立在这之上。把这三个Manager吃透了,后面的路就好走了。