Android O 收音机学习研究(基于Car)

本文深入研究了Android O中基于Car的收音机实现,从应用层的RadioService和RadioController,到Framework层的RadioManager和TunerAdapter,再到HAL层的接口调用。主要涉及ACTION_BOOT_COMPLETED启动RadioService,RadioDrawer操作,openRadioBand流程,TunerAdapter的使用,以及ProgramSelector在节目选择中的作用。通过对BroadcastRadioService.cpp和Tuner.cpp的分析,揭示了收音机功能从用户界面到硬件调频的实现路径。
摘要由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 <ModuleProperties>)} method.
  public static class ModuleProperties implements Parcelable
  /** Radio band descriptor: an element in ModuleProperties bands array.
     * It is either an in
  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Android收音机是一款基于Android系统开发的应用程序,可以让用户在移动设备上收听广播电台的功能。Android收音机具有以下特点和优势。 首先,Android收音机具有强大的功能和广泛的适用性。作为一个应用程序,它可以在绝大多数使用Android系统的手机和平板电脑上运行,为用户提供了广泛的选择。用户可以随时随地收听各个地区和类型的广播电台,且不受地理位置限制。同时,Android收音机还提供了智能搜索和预设功能,用户可以通过关键词或频率搜索到自己喜欢的电台,也可以将常听的电台保存在预设列表中,方便快捷地切换。 其次,Android收音机提供了丰富多样的节目内容。用户可以选择不同类型的广播节目,包括音乐、新闻、教育、体育等等。这种多样性使用户能够根据自己的喜好和需求选择感兴趣的节目内容,丰富了用户的娱乐和信息获取方式。 另外,Android收音机还具有便捷的操控和个性化的设置。用户可以通过简单直观的界面和交互操作来控制收听体验,例如调整音量、暂停等。同时,Android收音机还提供了个性化的设置选项,如音质调节、闹钟设置等,用户可以根据自己的需求来调整收听效果和个性化设置,提高用户体验和满足个性化需求。 综上所述,Android收音机作为一款移动智能设备的应用程序,具有广泛的适用性、丰富的节目内容和便捷的操控和个性化设置。它为用户提供了随时随地收听广播电台的便利,丰富了用户的娱乐和信息获取方式。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值