从CarAudioManager调用流程开始学习Vendor Interface(Client部分)

本文通过分析CarAudioManager的初始化、AudioFocus请求和setStreamVolume操作,探讨了Android Vendor Interface的Client部分。重点在于Binder化如何实现模块化,以及系统升级时的便利性。讲解了CarVolumeController、AudioHalService与VehicleHal的交互,揭示了车机控制的底层原理,涉及到车机相关的属性设置,并展示了Java与C++层的交互过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.需求

解决系统升级困难的问题(模块化)

a.以前用.h头文件的形式,各自Vendor有各自的so去实现硬件功能。

现在改成.hal文件的形式(Binder化),类似.aidl.

Thegoal of HIDL is that the framework can be replaced without having torebuild HALs. HALs will be built by vendors or SOC makers and put ina /vendor partitionon the device, enabling the framework, in its own partition, to bereplaced with an OTA without recompiling the HALs.

b.以前的输出打包进system里的一个个so

现在整个Vendor的东西应该是单独的一个啥?是一个vendor.img(里头有so),那么系统升级的时候,system.img就可以单拿出来。不用找各个硬件供应商,就可以用升级过的system.img去做替换升级

如图所示(图画的比较丑,抱歉)
这里写图片描述

这里写图片描述

屁话少说,放码过来。

「Talk is cheap. Show me the code」

RadioDemo中

CarAudioManger的初始化

//从CarService中取出Audio的
mCarAudioManager = (CarAudioManager) mCarApi.getCarManager(android.car.Car.AUDIO_SERVICE);

请求AudioFocus

mCarAudioManager.requestAudioFocus(this, mRadioAudioAttributes,AudioManager.AUDIOFOCUS_GAIN, 0);
//requestAudioFocus@CarAudioManger
mAudioManager.requestAudioFocus

好吧,和普通手机的一样,本集终!

看看最常用的setStreamVolume吧

mCarAudioManager.setStreamVolume(mStreamType, progress, AudioManager.FLAG_PLAY_SOUND);
//setStreamVolume@CarAudioService.java
//检查Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME权限
enforceAudioVolumePermission();
mVolumeService.setStreamVolume(streamType, index, flags);

//setStreamVolume@CarVolumeService
getController().setStreamVolume(streamType, index, flags);
//工厂
mCarVolumeController = CarVolumeControllerFactory.createCarVolumeController(mContext,mAudioService, mAudioHal, mInputService);

CarVolumeController是CarVolumeSer

好的,以下是一段示例代码: ```csharp // 定义一个接口,表示叫料的方法 public interface IOrderService { void Order(string item); } // 定义一个工厂类,根据传入的参数返回对应的叫料服务实例 public static class OrderServiceFactory { public static IOrderService GetOrderService(string vendor) { switch(vendor) { case "A": return new VendorAOrderService(); case "B": return new VendorBOrderService(); default: throw new ArgumentException("Unsupported vendor: " + vendor); } } } // 实现一个叫料服务,用于与 Vendor A 对接 public class VendorAOrderService : IOrderService { public void Order(string item) { // 调用 Vendor A 的 API 来下单 // ... Console.WriteLine("Ordered " + item + " from Vendor A."); } } // 实现另一个叫料服务,用于与 Vendor B 对接 public class VendorBOrderService : IOrderService { public void Order(string item) { // 调用 Vendor B 的 API 来下单 // ... Console.WriteLine("Ordered " + item + " from Vendor B."); } } // 使用工厂类获取叫料服务实例,并调用其 Order 方法来下单 public class Client { public void OrderItem(string vendor, string item) { var orderService = OrderServiceFactory.GetOrderService(vendor); orderService.Order(item); } } ``` 在上面的示例代码中,我们定义了一个 `IOrderService` 接口,表示叫料的方法。然后,我们实现了两个具体的叫料服务,分别用于与 Vendor A 和 Vendor B 对接。最后,我们使用 `OrderServiceFactory` 工厂类来根据传入的参数获取对应的叫料服务实例,并调用其 `Order` 方法来下单。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值