本文从Audio控制使用的角度,讲解了AudioStream的分类,硬件音量控制键调整对相应AudioStream音量大小的影响,以及如何响应远程MediaButton控制Audio播放。
1. Audio Stream
Android为不同的应用场合定义了不同的Audio Stream: Voice Call, Ring, Music,Alarm, Notification, DTMF。 这些AudioStream是相互独立的,所以也有各自的音量。AudioStream的定义在android.media.AudioManager中,如下图所示:
2. 硬件音量控制键Vol+/-控制Audio Stream的音量
用户按下音量控制的HardKey,希望能调出音量调整的界面。
缺省情况下,按下音量控制的硬件控制键Vol+/-,调节的是当前被激活的(Active)AudioStream的音量,如果你的程序当前没有正在播放任何声音,按下Vol+/-调节的是来电铃声的音量。【笔者注:基本是翻译的原话,需要明确!By
default, pressing the volume controls modifythe volume of the active audio stream. If your app isn't currently playing anything, hitting the volume keys adjusts the ringer volume.】
在某一个程序运行时,希望按下Vol+/-调节的是当前所使用的AudioStream的音量,Android在Activity中提供了setVolumeControlStream()方法用来指定你的应用程序使用的Audio Stream类型。所以,如果你的程序用到Audio的播放,你首先要知道你的程序所用的Audio Stream类型,并在onCreate()中调用setVolumeControlStream()来设定Audio Stream的类型。
Q:setVolumeControlStream()之后就起效,还是可见之后才有用?后台播放呢?
要明确这些标红的地方,需要看Android的内部实现!//TODO:明确化;内部实现,另外专题写…
3. 遥控Audio Playback
有些耳机上有诸如音量控制、切换前一首下一首歌、播放/暂停等控制键,Bluetooth的AVRCP Profile也能远程控制的。这些键被按下后,Android是通过broadcastACTION_MEDIA_BUTTON这个Intent发出去的。
所以,要在你的应用中处理这些按键,只要侦听这个广播,并处理即可。
如果知道什么时候开始侦听广播,程序中动态注册/注销侦听都是很好的选择(与,写在AndroidManifest中,apk加载时就注册相比)。而Audio控制在什么时候才处理这些键值是比较明确的,一般获得AudioFocus的情况下,响应ACTION_MEDIA_BUTTON广播;失去Audio
Focus的情况下,不响应ACTION_MEDIA_BUTTON广播,这也就是相应registerMediaButtonEventReceiver()/unregisterMediaButtonEventReceiver()的最佳时机。
ACTION_MEDIA_BUTTON广播的处理,只要在override onReceive(),并在其中通过判断是否Intent.ACTION_MEDIA_BUTTON确保是这个广播,从Intent.EXTA_KEY_EVENT中获得KeyEvent,做相应的处理即可。
涉及的几个类的关系图如下:
相应处理的代码片段如下:
-
publicclassRemoteControlReceiverextendsBroadcastReceiver{
- @Override
-
publicvoidonReceive(Contextcontext,Intentintent){
-
if(Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())){
- KeyEventevent=(KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
-
if(KeyEvent.KEYCODE_MEDIA_PLAY==event.getKeyCode()){
- }
- }
- }
- }
总结一下要点:
1.Android的Audio控制是按照Audio Stream划分的;
2.各个Audio Stream的音量是独立的。推荐在onCreate()中通过Activity.setVolumeControlStream()方法设置所使用AudioStream的类型,实现按下硬键Vol+/-调整的是相对应AudioStream的音量;
3.侦听Intent.ACTION_MEDIA_BUTTON广播实现对远程Media控制的处理。
分享到:
相关推荐
Android AudioRecord和MediaRecorder录音并实现了实时获取音量大小 看代码就知道了
android使用audioRecord和audioTrack实现语音录音播放与即时播放
Android 使用 AudioRecord 和 AudioTrack 完成音频PCM数据的采集和播放,并读写音频wav文件。 封装好的Java代码,可同时录制PCM和WAV文件。自己定义存储位置。 Android提供了AudioRecord和MediaRecord。MediaRecord...
AudioFlinger和AudioPolicy两者是Android Audio框架层最主要的两个服务,他们两个是Android框架层的本地服务,在init.rc中启动; AudioPolicyManager负责音频策略定制者,说白了就相当于Audio系统的司令。 Audio...
Android 12 AudioFlinger 分析(RK3588)
ios中audio不能直接通过audio.play()播放,需要用户在click事件或者touch事件中执行audio.play()才能播放。 ajax回调中audio.play()音乐不能正常播放。 用户点击按钮,等服务器返回数据后再播放相应的成功或失败的...
android播放在线音乐demo,获取在线音乐并播放控制等,可直接运行实现
Android的Audio系统 Android的Audio系统
该播放器支持随机播放和音量调节,可以让用户更加方便地控制音乐的播放。 在实现过程中,我们可以使用html5的audio标签来播放音乐,并结合audio.js库来实现更多的功能。通过使用audio.js库,我们可以实现音乐的随机...
android audio system
android AudioRecord AudioTrack实现录音并播放 并支持参数选择(频率、编码格式、声道) 更多信息可参考http://blog.sina.com.cn/u/1788464665
Android 蓝牙 A2DP播放AVDTP连接,音乐从audio到A2dp蓝牙侧,流程图。非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙...
Android下录音及播放录音(AudioRecord),经过测试可以运行,欢迎下载
一个挺简单的Android audio多媒体编程实例,在源代码中:声明一个ImageButton,TextView,MediaPlayer变量,声明一个Flag作为确认音乐是否暂停的变量并默认为false,通过findViewById构造器创建TextView与ImageView...
AudioRecorder2Mp3Util 负责录音和转换 MainActivity 用户的操作界面 封装好格式转化成MP3 注意用的时候需要加上权限 录音权限 <uses-permission android:name="android.permission.RECORD_AUDIO" /> 往SDCard...
主要介绍 述写了Android Audio部分,感觉 很不错的
主要介绍了Android中实时获取音量分贝值详解,本文讲解了基础知识、Android API、MediaRecorder、AudioRecord等内容,需要的朋友可以参考下
调用Android自带的播放器播放Audio
Hack Audio:An Introduction to Computer Programming and Digital Signal Processing in Matlab 2019 Hack Audio:An Introduction to Computer Programming and DSP in Matlab.part1.rar (15 MB, 下载次数: 237...
android audio 框架流程分析图