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的核心功能有三个:

  1. 连接管理:管理手机和车机的连接状态。连接、断开、重连,都归它管。
  2. 屏幕投影:把手机屏幕内容投射到车机屏幕上。支持横竖屏自适应。
  3. 输入转发:把车机上的触摸、按键事件转发给手机应用。

关键点:CarProjectionManager只是提供了连接和投影的基础能力。真正的应用交互逻辑,还得靠你自己写。比如,怎么处理车机上的多点触控?怎么适配不同分辨率的车机屏幕?这些都需要你额外处理。

知识体系总览

说了这么多,咱们用一张图把整个CarLibrary的知识体系串起来。这样你脑子里能有个整体框架。

CarLibrary 知识体系 Car 类(入口) CarSensorManager CarInfoManager CarProjectionManager 传感器数据 车速 / 转速 / 燃油量 胎压 / 里程 / 温度 车辆信息 品牌 / 型号 / 年份 驱动类型 / 能源类型 投影连接 连接管理 / 屏幕投影 输入转发 / 事件处理 所有操作必须通过 Car 类获取 Manager 实例

这张图把CarLibrary的核心脉络理清楚了。你写代码时,记住一个原则:先拿Car,再拿Manager,最后干活。顺序不能乱,少了哪一步都不行。

个人经验:刚开始用CarLibrary时,我总忘记检查Manager是否为null。有些车可能不支持某些Manager,直接调用会崩。后来我养成了习惯,每次获取Manager后都做一次null检查。这个习惯救了我好几次。

好了,这一章的内容就到这。CarLibrary是车机开发的基石,后面的所有内容都建立在这之上。把这三个Manager吃透了,后面的路就好走了。

公众号:蓝海资料掘金营,微信deep3321