android o car模块,Android O 收音机学习研究(基于Car)

本文深入探讨了Android O中Car模块的收音机功能。从应用层的RadioService和RadioController开始,分析了如何打开AM/FM广播,重点讨论了RadioManager类及其与硬件交互的过程。涉及到的关键类包括RadioManager、RadioTuner、ModuleProperties和ProgramSelector,以及Binder通信和服务之间的交互。此外,还提到了权限管理和HAL层的实现细节。
摘要由CSDN通过智能技术生成

应用层

Demo路径:

packages/apps/Car/Radio

BootupReceiver类监听了ACTION_BOOT_COMPLETED,然后在onReceive里启动了RadioService.

CarRadioActivity作为主Activity,在onCreate里创建了mRadioController.

收音机主界面有个RadioDrawer(收音机抽屉).点击其中一个就会调用

mRadioController.openRadioBand(SUPPORTED_RADIO_BANDS[position]);

SUPPORTED_RADIO_BANDS定义

private static final int[] SUPPORTED_RADIO_BANDS = new int[] {

RadioManager.BAND_AM, RadioManager.BAND_FM };

虽然没看到实际界面,其实这个地方也就是选择AM或者FM,大家都玩过收音机,完全可以自己脑补!

openRadioBand@RadioController:

...

mRadioManager.openRadioBand(radioBand);

...

fuck这个mRadioManager并不是RadioManager类型的.而是com.android.car.radio.service.IRadioManager

总之实现是在这里:

./src/com/android/car/radio/RadioService.java

//openRadioBand@RadioService

...

openRadioBandInternal(radioBand);

...

openRadioBandInternal@RadioService

if (mRadioTuner != null) {

mRadioTuner.setConfiguration(config);

} else {

mRadioTuner = mRadioManager.openTuner(mModules.get(0).getId(), config, true,

mInternalRadioTunerCallback, null /* handler */);

}

这个mRadioManager才是真的android.hardware.radio.RadioManager的(Android的开发者命名的时候不怕我们混淆吗?).

framework层

先把用得到的几个类堆出来一下:

//The RadioManager class allows to control a broadcast radio tuner present on the //device.It provides data structures and methods to query for available radio modules,

//list their properties and open an interface to control tuning operations and receive callbacks when asynchronous operations complete or events occur.

base/core/java/android/hardware/radio/RadioManager.java

//Implements the RadioTuner interface by forwarding calls to radio service.

base/core/java/android/hardware/radio/TunerAdapter.java

/**

* RadioTuner interface provides methods to control a radio tuner on the device: selecting and

* configuring the active band, muting/unmuting, scanning and tuning, etc...

*

* Obtain a RadioTuner interface by calling {@link RadioManager#openTuner(int,

* RadioManager.BandConfig, boolean, RadioTuner.Callback, Handler)}.

* @hide

*/

base/core/java/android/hardware/radio/RadioTuner.java

//package底下,car相关

//A representation of a radio station.

//电台相关,比如说频道名字,频段之类的

apps/Car/libs/car-radio-service/src/com/android/car/radio/service/RadioStation.java

//A set of identifiers necessary to tune to a given station.

/* This can hold various identifiers, like

* - AM/FM frequency

* - HD Radio subchannel

* - DAB channel info

*/

base/core/java/android/hardware/radio/ProgramSelector.java

其中,最上层的RadioManager这个类.我们可以简单的提炼一下

public class RadioManager {

//列出给定广播无线电模块支持的属性,选项和无线电频段。

//调用RadioManager APIs的时候,每一个module都有唯一的ID用来定位自己.

//Module properties are returned by {@link #listModules(List )} method.

public static class ModuleProperties implements Parcelable

/** Radio band descriptor: an element in ModuleProperties bands array.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值