Android FrameWork音频管理AudioManager的一点解析

近期要匹配部分第三方应用到系统中,但是涉及到音频部分还存在逻辑的BUG。因此重点关注了下音频管理的部分代码,写一部分目前已经理解的部分。

首先要先阐述下为什么会做现在的工作,起因就是系统中已经有了要调用声音的应用,所以同时再运行另外的需要用到声音的应用时必须要有一个优先级来约束这些声音的音量大小及先后顺序。因此需要对这部分音频管理做逻辑上的处理,使其能协调的发出声音而不是产生声音的重叠和混乱。

查看了FrameWork的代码即SDK文档,最终定位在如下路径的源码中

/frameworks/base/media/java/android/media/AudioManager.java

/frameworks/base/media/java/android/media/AudioService.java

因为初次接触很多只是学习框架的时候了解了下并未仔细看过源码,此次就需要仔细的看了。

查资料得知,在AudioManager中,Android2.2之前的版本是不存在多个程序同时竞争Audio资源的机制的,因此可能在那个版本前音频的管理应该是仅限于音量大小的调整,而不存在竞争互斥优先级高低之分的。

所以先从简单的声音调节入手来分析。

先看一部分代码中的定义:

    /** The audio stream for phone calls */
    public static final int STREAM_VOICE_CALL = AudioSystem.STREAM_VOICE_CALL;
    /** The audio stream for system sounds */
    public static final int STREAM_SYSTEM = AudioSystem.STREAM_SYSTEM;
    /** The audio stream for the phone ring */
    public static final int STREAM_RING = AudioSystem.STREAM_RING;
    /** The audio stream for music playback */
    public static final int STREAM_MUSIC = AudioSystem.STREAM_MUSIC;
    /** The audio stream for alarms */
    public static final int STREAM_ALARM = AudioSystem.STREAM_ALARM;
    /** The audio stream for notifications */
    public static final int STREAM_NOTIFICATION = AudioSystem.STREAM_NOTIFICATION;
    /** @hide The audio stream for phone calls when connected to bluetooth */
    public static final int STREAM_BLUETOOTH_SCO = AudioSystem.STREAM_BLUETOOTH_SCO;
    /** @hide The audio stream for enforced system sounds in certain countries (e.g camera in Japan) */
    public static final int STREAM_SYSTEM_ENFORCED = AudioSystem.STREAM_SYSTEM_ENFORCED;
    /** The audio stream for DTMF Tones */
    public static final int STREAM_DTMF = AudioSystem.STREAM_DTMF;
    /** @hide The audio stream for text to speech (TTS) */
    public static final int STREAM_TTS = AudioSystem.STREAM_TTS;
    /** Number of audio streams */

再看一段调节音量的代码

    private AudioManager mAudioManager;
    mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
    mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FX_FOCUS_NAVIGATION_UP);

上面这部分代码是调整音乐的音量的部分代码,实现效果为按步长1来做声音增大,并且此时调用会出现系统音量条的变化,此操作后续会分析。

现在重点分析函数adjustStreamVolume(int streamType,int direction,int flags)

参数streamType:这部分参数就是最开始定义过的,有STREAM_VOICE_CALL-- 通话,STREAM_SYSTEM -- 系统音量, STREAM_RING -- 铃声

STREAM_MUSIC -- 音乐, STREAM_ALARM -- 闹钟 , STREAM_NOTIFICATION -- 通知, STREAM_BLUETOOTH_SCO -- 蓝牙通话,

后三种看起来不经常用,不是很明白。

参数direction: 这部分参数的定义有ADJUST_RAISE -- 增大, ADJUST_LOWER -- 减小, ADJUST_SAME -- 相同,针对ADJUST_SAME这个参数,可以实现一个小用途就是                                     调用后可弹出系统音量条而不会使音量变化。

参数flags:这部分为标志位,可选。代码中用到的是焦点上移的标志位,具体有什么特殊用途后续会跟进。

另外其他部分声音调节函数有setStreamVolume(int streamType, int index, int flags) ,这个函数跟上个函数的区别就是上个函数是按步进进行调节,这个函数是可以直接给第二个参数直接赋值,指定音量值来设置。不过需要对参数的取值范围进行判定,以免超出有效值范围。

其他相关函数:

getMasterMaxVolume() -- 获取系统主音量的最大值

getMasterVolume() -- 获取系统当前音量值

getLastAudibleMasterVolume() -- 获取系统静音前的有效音量

getMode() -- 获取当前音频模式,如MODE_INVALID -- 无效,MODE_CURRENT -- 当前,NORMAL--普通,RINGTONE -- 铃声,MODE_IN_CALL --接通电话,                                                                MODE_IN_COMMUNICATION -- 通话。

getRingMode() -- 获取响铃方式,如RINGER_MODE_SILENT -- 静音,RINGER_MODE_VIBRATE -- 震动,RINGER_MODE_NORMAL -- 正常,RINGER_MODE_MAX-- 正常

getStreamVolume(int streamType) -- 获取当前模式下的音量值

getStreamMaxVolume(int streamType) -- 获取当前最大铃声音量值

上述部分是AudioManager中关于音量调节的部分解析。后续继续关于调节的涉及另外部分的函数解析。

时间: 2024-10-07 14:32:45

Android FrameWork音频管理AudioManager的一点解析的相关文章

Android FrameWork音频管理AudioManager的一点解析(续二)

上面两篇简单的分析了,android系统中FrameWork中对于音量的调节的部分代码,可能有些更深入的东西并没有涉及,因为初次尝试分析,并不是所有东西都能完全明白和透彻的理解,所以暂时只能将我所了解到并用到的部分做了解析. 这篇主要想解析下在AudioManager中对于音频竞争机制的部分内容和使用方式. 首先来说下这中竞争机制的产生原因,根据我的理解因为Android系统中存在众多音频类型,并且他们相互之间都保持独立的存在,并不会相互影响.如音乐的声音,按键的触摸声音,响铃的声音,通话的声音

Android FrameWork音频管理AudioManager的一点解析(续一)

上篇里面提到了声音调整的两种操作,接下来就要具体分析下音量调节的大概步骤,分别涉及到两部分: android\frameworks\base\media\java\android\media\AudioService.java android\frameworks\base\media\java\android\media\IAudioService.aidl 其中adjustStreamVolume(int streamType, int direction, int flags)函数的声明是

Android Framework学习(一)之init进程解析

init进程是Android系统中用户空间的第一个进程,它被赋予了很多极其重要的工作职责,init进程相关源码位于system/core/init,本篇博客我们就一起来学习init进程(基于Android 7.0). init入口函数分析 init的入口函数为main,位于system/core/init/init.cpp int main(int argc, char** argv) { if (!strcmp(basename(argv[0]), "ueventd")) { ret

Android提供的系统服务之--AudioManager(音频管理器)

Android提供的系统服务之--AudioManager(音频管理器) ----转载请注明出处:coder-pig AudioManager相关简介与常用方法图: 简单的使用例子: 使用Mediaplayer播放音乐,通过AudioManager调节音量大小与静音: 这里,我们需要把要播放的音频文件放到res下的raw文件夹,这个文件夹默认是没有的,需要自己创建哦! 用来放原生资源的,就是打包编译的时候不会把他变成二进制文件!!! 先来看看效果图吧: 就是播放音乐,然后调高音量的时候可以看到滑

Android开发之AudioManager(音频管理器)详解

AudioManager简介: AudioManager类提供了访问音量和振铃器mode控制.使用Context.getSystemService(Context.AUDIO_SERVICE)来得到这个类的一个实例. 公有方法: Public Methods int abandonAudioFocus(AudioManager.OnAudioFocusChangeListenerl) 放弃音频的焦点. void adjustStreamVolume(int streamType, int dir

Android基础入门教程——10.3 AudioManager(音频管理器)

在多媒体的第一节,我们用SoundPool写了个Duang的示例,小猪点击一个按钮后,突然发出”Duang”的 一声,而且当时的声音很大,吓死宝宝了,好在不是上班时间,上班时间偷偷写博客给经理知道 会作死的~嗯,好的,说到这个声音大小就得介绍下Android为我们提供的(音量大小控制)的API: AudioManager(音频管理器)了,该类位于Android.Media包下,提供了音量控制与铃声模式相关操作!... www.mafengwo.cn/i/4012346.htmlwww.mafen

初学Android 音频管理器之控制音频 六十六

下面要写的是AudioManager这个音频管理器,它可以通过getSystemService得到 有一个重要方法adjustStreamVolumn(int streamType,int direction,int flags) streamType 这个参数指定了声音的类型,如下 STREAM_ALARM:手机闹铃声音 STREAM_DTMF:DTMF音调的声音 STREAM_MUSIC:手机音乐的声音 STREAM_NOTFICATION:系统提示的声音 STREAM_RING:电话铃声的

Android Framework 记录之一

简介 之前的研究太偏向应用层功能实现了,很多原理不了解没有深究,现在研究framework框架层了. 原文地址:http://blog.csdn.net/banketree/article/details/24718899 记录 1.下载源码,目录如下: 2.Android系统的层次如下: 3.项目目录简单分析如下: 4.telphony目录 文件 描述 CellIdentityCdma //描述电信通信标识 CellIdentityGsm 描述移动通信标识 CellIdentityLte 描述

Android Framework 简介

Android Framework 简介 简介 之前的研究太偏向应用层功能实现了,很多原理不了解没有详记,结果被很多公司技术人员鄙视了,为了减少自己的短板,重新复习了一遍C++.java.Android的开发,现在开始研究应用框架层了. 记录 1.下载源码,目录如下: 2.Android系统的层次如下: 3.项目目录简单分析如下: 4.telphony目录 文件 描述 CellIdentityCdma //描述电信通信标识 CellIdentityGsm 描述移动通信标识 CellIdentit