AudioFocus相关的API一共有三个,分别是requestAudioFocus()、abandonAudioFocus()以及AudioFocusListener回调接口,它们分别负责AudioFocus的申请、释放以及变化通知。为了让大家了解AudioFocus的实现原理,我们
AudioFocus是自Android 2 3建立起来的一个新的机制。这套新机制的目的在于统一协调多个回放实例之间的交互。我们知道,手机的多媒体功能越来越强大,听音乐、看视频、听收音机已经成为这台小小的设备的重要功能
这一节以有线音频外设为例,探讨了从WiredAccessoryObserver收到UEvent开始到AudioService通知底层应用为止的AudioService对音频外设的管理机制。总结一下音频外设拔插的处理过程:由负责相关外设的模块监听从硬
最终还是要回到AudioService中来,它才是音频相关操作的主基地。1 处理来自WiredAccessoryObserver的通知AudioService会如何处理外设的可用状态变化呢?仔细想想,在开发播放器的时候一定接触过ACTION_AUDIO_B
1 WiredAccessoryObserver简介这要从WiredAccessoryObserver开始讲起,它是内核通知有线耳机插入事件所到达的第一个环节。WiredAccessoryObserbver继承自UEventObserver。UEventObserver是Android用来接收UEve
这一节将探讨AudioService的另一个重要功能,那就是音频外设的管理。看过卷I第7章的读者应该对音频外设这个概念并不陌生。在智能机全面普及的时代,对有线耳机、蓝牙耳机等音频外设的支持已经是手机的标准,有些
音量控制是AudioService最重要的功能之一。经过上面的讨论,相信读者对AudioService的音量管理流程已经有了一定的理解。总结一下我们在这一节里所学到的内容:AudioService音量管理的核心是VolumeStreamState。它
静音控制的情况与音量调节有很大的不同。因为每个应用都有可能进行静音操作,所以为了防止状态发生紊乱,就需要为静音操作进行计数,也就是说多次静音后需要多次取消静音。不过,进行了静音计数后还会引入另外一
除了可以通过音量键调节音量以外,用户还可以在系统设置中进行调节。Audio-Manager setStreamVolume()是系统设置界面中调整音量所使用的接口。1 setStreamVolume()分析setStreamVolume()是SDK中提供给应用的A
1 触发音量键在音量键被按下后,Android输入系统将该事件一路派发给Activity,如果无人截获并处理这个事件,承载当前Activity的显示PhoneWindow类的onKeyDown()或onKeyUp()函数将会处理,从而开始通过音量键调
Android手机有两种改变系统音量的方式。最直接的做法就是通过手机的音量键进行音量调整,还有一种做法是从设置界面中调整某一种类型音频的音量。另外,应用程序可以随时将某种类型的音频静音。它们都是通过Audio
通过对卷I第7章的学习,相信大家已经对AudioTrack、AudioRecord、音频设备路由等知识有了深入了解。这一章将详细介绍音频系统在Java层的实现,围绕AudioService这个系统服务深入探讨在Android SDK 中看到的音频
本章主要内容:探讨AudioService如何进行音量管理了解音频外设的管理机制探讨AudioFocus的工作原理本章涉及的源代码文件名及位置:AudioManager javaframework base media java android media AudioManager java
本章先对Java层的Binder架构做了一次较为深入的分析。Java层的Binder架构和Native层Binder架构类似,但是Java的Binder在通信上还是依赖Native层的Binder。建议想进一步了解Native Binder工作原理的读者,阅读卷
想不到,一个小小的MessageQueue竟然有如此多的内容。在后面分析Android输入系统时,会再次在Native层和MessageQueue碰面,这里仅是为后面的相会打下一定的基础。现在将站在一个比具体代码更高的层次来认识一下M
nativePollOnce()的实现函数是android_os_MessageQueue_nativePollOnce,代码如下:[android_os_MessageQueue cpp-->android_os_MessageQueue_nativePollOnce()]static void android_os_MessageQueue_nativePo
当一切准备就绪后,Java层的消息循环处理,也就是Looper会在一个循环中提取并处理消息。消息的提取就是调用MessageQueue的next()方法。当消息队列为空时,next就会阻塞。MessageQueue同时支持Java层和Native层的
现在来分析MessageQueue是如何跨界工作的,其代码如下:[MessageQueue java-->MessageQueue MessageQueue()]MessageQueue() { nativeInit(); 构造函数调用nativeInit,该函数由Native层实现}nativeIn
卷I第5章介绍过,MessageQueue类封装了与消息队列有关的操作。在一个以消息驱动的系统中,最重要的两部分就是消息队列和消息处理循环。在Andrid 2 3以前,只有Java世界的居民有资格向MessageQueue中添加消息以驱
图2-4展示了Java层的Binder架构。根据图2-4可知:对代表客户端的BinderProxy来说,Java层的BinderProxy在Native层对应一个BpBinder对象。凡是从Java层发出的请求,首先从Java层的BinderProxy传递到Native层的BpB