Android.media.AudioManager中包含了对android.media.AudioService的跨进程AIDL调用封装。
正常处理过程:
1.调整音量是通过AudioManager间接调用AudioService.adjustStreamVolume方法来完成逻辑处理;
2.AudioService调用VolumePanel画出音量调整界面,并发送音量变动广播消息,
3.StatusBarPolicy,接收广播消息判断是否在状态栏显示静音或振动图标。
问题点:
1.AudioManager如何接收音量调整事件?
答:PhoneWindowManager.interceptKeyBeforeQueueing处理的
WindowManagerService循环读取下面的消息再做分发到窗口接收,在消息分发前会有一个类做消息过滤处理,就是PhoneWindowManager.interceptKeyBeforeQueueing;
比如音量调整、Home键都在这个类里面做特殊处理,详细内容后面会在其它该当再补充
2.谁负责处理音量显示的?
答:AudioManager调用AudioService来显示的。事件触发在AudioManager,代码的执行实现在AudioService中。状态栏是SystemUI的APK包StatusBarPolicy中接收广播消息来处理的。
源码位置:
/frameworks/base/media/java/android/media/AudioManager.java
/frameworks/base/media/java/android/media/AudioService.java
/framework/base/core/java/Android/view/VolumePanel.java
/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarPolicy.java
AudioService.adjustStreamVolume方法完成以下三个功能:
一.音量调整
音量调整分为两步:先查看模式(Ring mode)是否需要调整? 然后再调用调整音量。
调整模式通过调用checkForRingerModeChange(oldIndex, direction);实现,
调整音量通过调用streamState.adjustIndex(direction)实现。
二.向用户显示调整音量的界面
调用mVolumePanel.postVolumeChanged(streamType, flags);发送音量变动消息,向用户显示改变结果。
调用过程VolumePanel.postVolumeChanged->VolumePanel.onVolumeChanged->VolumePanel.onShowVolumeChanged->mToast
AudioService.java 应用声音
private void setStreamVolumeIndex(int stream, int index) {
AudioSystem.setStreamVolumeIndex(stream, (index + 5)/10);
}
三.广播音量有变动的系统事件
AudioService.sendVolumeUpdate(streamType);广播音量有改变的系统事件,状态栏根据这广播事件显示静音或振动图标
状态栏的静音或振动图标显示过程
StatusBarPolicy主要负责在静音模式(silent mode)和振动模式(vibrate mode)下在状态栏(status bar)的右方显示一个代表相应意义的图标。
一.系统启动后,StatusBarPolicy会注册一个Receiver,它可以接收很多种广播,其中就有AudioService在完成每一次的模式和音量更新时发出的两个广播事件
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver()//新一个广播接收类‘
filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);//添加接收的广播消息
filter.addAction(AudioManager.VIBRATE_SETTING_CHANGED_ACTION);
mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);//注册一个Receiver,接收广播消息
二.接收广播,并调用updateVolume调整状态栏显示
else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION) ||
action.equals(AudioManager.VIBRATE_SETTING_CHANGED_ACTION)) {
updateVolume();//调用音量状态栏显示
}
相关推荐
《Android源码解析:MusicPlayer音乐播放器》 在Android平台上,MusicPlayer是常见的音频播放应用,其源码是深入...通过学习和研究,开发者不仅可以掌握音乐播放器的实现原理,还能深入理解Android系统的运行机制。
5. **AudioManager**:这是Android框架层的一个关键类,提供了控制音频系统的接口,如设置音量、切换音频输出源、获取音频焦点等。 6. **AudioAttributes**:定义了音频流的属性,如内容类型、使用场景和音量级别,...
【Android音乐播放器】是一个基于...这个项目为学习Android应用开发提供了完整的实战案例,可以帮助开发者深入理解Android系统的工作原理,提升开发技能,并且可以作为参考,为自己的项目开发提供灵感和解决方案。
本文将深入探讨"Android MusicPlayer音乐播放器源码",分析其核心功能和实现原理,为初学者提供一个清晰的学习路径。 首先,Android MusicPlayer源码是基于Android SDK构建的,它展示了如何在Android平台上创建一个...
通过学习Android RockPlayer的源码,开发者不仅可以掌握多媒体播放器的设计原理,还能深化对Android系统底层机制的理解,提高解决问题的能力。对于希望在Android平台上构建高效、高质量多媒体应用的开发者来说,这是...
在Android中,这需要利用Android Media Framework,它是处理音频、视频和图像的底层系统服务。音乐播放器的基本功能包括播放、暂停、停止、上一曲、下一曲,这些可以通过`MediaPlayer`类来实现。`MediaPlayer`提供了...
1. **多媒体框架:** Android系统中的多媒体框架是Android Media Framework (AMF),它由多个层次组成,包括低层的硬件抽象层(HAL)、媒体库(如Mediacodec)和上层的应用API。网络视频播放器的核心在于解码和渲染,...
【Android手机影音源码解析】 在移动设备领域,Android...通过深入学习和分析这个源码,开发者不仅可以掌握Android影音播放的基本原理,还能提升自己在多媒体开发方面的技能,为创建更优秀的移动应用打下坚实基础。
在Android平台上,开发一个简易录音机应用涉及到许多关键知识点,这些知识涵盖了Android应用程序的基本结构...通过分析和理解这个源码,开发者可以深入了解Android录音功能的实现原理,并为构建更复杂的应用打下基础。
本篇文章将围绕“Android音乐播放器(晴天播放)”这一主题,详细探讨其背后的编程原理、关键技术和实现细节,以便于开发者能够理解和复用源码,提升自己的技能水平。 首先,我们关注到该资源的标签——"android"、...
5. 控制界面:RockPlayer的用户界面也是源码的重要组成部分,包括播放、暂停、快进、快退等操作的实现,以及播放进度、音量控制等界面元素的交互逻辑。 6. 网络流支持:如果RockPlayer支持在线播放,源码中会有处理...
1. **Android多媒体框架**:Apollo是基于Android的Media Framework构建的,这个框架包括MediaExtractor(用于解析媒体文件)、MediaCodec(用于解码音频/视频流)和AudioTrack(用于播放音频)。了解这些组件的工作...
- **Android Media Framework**:Android系统提供的多媒体库,用于处理音频、视频等多媒体内容。 - **Java/C++/Kotlin**:Android应用的主要开发语言,其中Java和Kotlin用于编写应用程序逻辑,C++可能用于优化性能...
在Android平台上开发一款音乐播放器是一项常见的任务,尤其对于初学者来说,这是一次极好的实践机会,可以深入了解Android应用开发的基本原理。本项目是一个基于Android 2.1系统的音乐播放器源码,它提供了基本的...
通过学习和分析VideoPlayerDemo,开发者可以深入理解Android多媒体播放的原理和实践,为创建自己的视频播放应用打下坚实基础。这个项目不仅涵盖了基础的视频播放功能,也可能涉及到了一些高级特性,如视频流处理、...