
[Android项目]本地FM广播开发和源代码分析
目录
1. 概述
本地FM()应用程序通过接收和解调频率调制(FM)或幅度,从而不同于Android手机硬件的调谐芯片的当前网络FM(喜马拉雅山,考拉等). 广播电台发出的电磁波的调制(AM)信号以播放并显示相应的节目信息. 因此,本地应用程序通常不需要联网,其核心取决于硬件调整芯片. 因此,并不是所有的手机都能收听本地广播,但是大多数手机都支持它们.
2. 广播的基本原理
广播的核心原理是: 广播播音员将设备处理过的音频信号广播为电信号,并携带它调制波的频率或幅度,然后发出. 通过信号放大和其他操作将信号输出到扬声器,以将电信号恢复为音频信号.
上面提到了两种调制方式: AM(调幅)/ FM(调频);
那为什么需要调制?
由于在正常情况下,人们可以听到的声音频率在20--20Khz之间. 声波的传输介质是空气,但衰减大,传输距离很短,大约几十米. 因此,直接使用声波进行传输是不现实的. 但是波在空中传播的媒介是电磁场,传播距离长. 因此,在将声波转换为电信号并用波对其进行调制后,它们具有远距离传输的特性.
AM(幅度调制)方法: 将信号波的信号调制到载波上,从而改变载波的幅度. 频率在503 --- 1060KHz之间
FM(调频)模式: 信号波的信号在载波上调制,从而改变载波的频率. 调频范围在我国为76-108MHz,在日本为87.5-108MHz,在日本为76-90MHz.

端接收信号并执行解调和放大,以通过扬声器恢复音频.
3. 其他信息RDS功能

RDS代表“数据系统”无线数据广播系统;上面我们只讨论了信号波的传输. 如果只有信号波,则显示的信息将非常单调. 只能显示当前频率. 但是除了这些之外,广播电台还具有广播电台名称,节目信息,介绍和其他相关信息. 这时,有必要依靠RDS来完成. 它使用FM广播传输信号中的子载波以数字形式发送信息安卓离线收音机,例如电台名称. 在方面,信息通过具有RDS功能的调谐芯片进行解析和显示.
因此,使用RDS的前提是和调谐器芯片都必须同时支持RDS功能. 但目前只有少数广播电台支持RDS.
RDS具有两个核心功能: AF和TA;
AF表示当当前电台的信号低于某个特定值时,它将自动搜索该电台信号良好的其他频道并自动切换. 为了获得更好的用户体验.
TA功能是强制性的广播功能. 如果发生重大事故,紧急通知和其他交通信息,将被迫切换到该频率进行播放.
对于特定的RDS功能,您可以搜索[FM Radio_RDS功能概述和编码]以了解更多信息.
4. Android开发FM广播源代码分析
首先让我们看一下层次结构
硬件驱动程序(由芯片制造商提供)-> HAL(遵循HAL接口协议)-> C动态库(JNI调用)->框架(RadioManager)->应用程序(逻辑和接口).
RadioManager类隐藏在系统API中. 如果要在AndroidStudio中进行编译,则需要进行编译. 您可以自己咨询它,但应该始终获取framework.jar.
下面我用一个时序图来展示,让我们不要讨论如何在应用程序级别设计框架,让我们首先看看我们是否在App中调用tune(...)方法来播放某个广播电台,从框架开始,并经历了以下一些过程.

上面的时序图基于8.0的源代码. 实际上,9.0的源代码和8.0的之间有很多差异. 演示的结构变得越来越多,源代码中App的广播演示位于目录中:
android-8.0.0_r1 \ packages \ apps \ Car \ Radio \ src \ com \ android \ car \ radio \

上面的时序图中似乎缺少什么?
HAL似乎与框架直接交互,中间不应有jni;所以我们找到目录
android-8.0.0_r1 \ frameworks \ base \ core \ jni \ android_hardware_Radio.cpp
我们知道jni扮演着链接Java和c的角色. 实际上,它是java中的方法与c中的方法或jni中对应于java的方法之间的映射,以及c的方法处理逻辑.
所以让我们看一下这些类的方法
RadioTMoudle.java中的方法:

在android_hardware_Radio.cpp中查看对应关系
我们看到了什么?
RadioTMoudle.java中的方法都在android_hardware_Radio.cpp中,但是方法名称都添加了固定前缀,这只是jni的特征. 说明这两个文件可以对应.

例如,手表
(void *)android_hardware_Radio_tune方法查看执行的操作


再次查看ITuner.hal文件中的调整方法

似乎符合要求.
5. 如何在App层中设计本地FM应用程序
在上面,我们仅完成了Tuner的基础调用流程. 然后问题来了,我是进行FM本地应用程序开发的人,这些框架都已完成. 这跟我有什么关系实际上,否则,理解这些原理可以使我们在调试时更容易定义问题. 底层不对吗?对. 而且,在定制系统中,如果对进行了定制,则会根据需要修改底层安卓离线收音机,因此也很不稳定.
因此,如果您设计应用程序层的框架结构.
答案: 随需应变. .
假设我的需求是这样的,那么,实际上我的项目需求不是这样的.

别说话,看照片.

要求的简要说明:
1-主界面(发射器)下有一个控制面板,可以操作收音机.
2-单击控制面板的空白区域以打开单选页面. 可以操作和显示并保存接口. 状态与外部控制面板一致

3-外部扩展控制,磁盘控制,语音控制等;
4-遵循音频聚焦策略
分析:
1-控制面板的显示: 与小部件桌面小部件一起显示. 通过广播与应用程序FM交互.
2-单击空白区域以打开并启动“活动”界面. 在界面上执行操作,但是您需要考虑的是,如果直接通过控制面板进行操作,则可以在不启动活动的情况下进行游戏. 因此,必须在后台运行CoreService核心服务,而不依赖于接口.
3-外部控制也应与Servicre互动. 需要考虑其可扩展性
4-监视焦点获取和丢失并执行逻辑处理.
设计:
经过以上分析,我们整理出以下核心要点
CoreService真正可操作的核心服务
活动主界面
小部件控制面板
代码设计模式: 可以自己看到,这里使用MVP模式. 然后将有两个演示者:
RaidoPresenter核心操作(包括音频处理)
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-255988-1.html
加油~
还有一点没吃过这种芝麻糊不知道的是
如果你说日本后面的主子才是关键
上次来过