Android音乐编程:管理音频焦点
Android 系统保持相互独立的音频流通道来播放音乐,报警,通知,来电铃声,系统声音,呼叫(通话)音量,和 DTMF 音调(键盘拨号)。这样做主要是为了使用户能够独立地控制每个流的音量。
AD:
http://mobile.51cto.com/android-309321.htm
识别音频流
创造优秀音频体验的第一步是了解您的应用程序将使用的音频流类型。
Android 系统保持相互独立的音频流通道来播放音乐,报警,通知,来电铃声,系统声音,呼叫(通话)音量,和 DTMF 音调(键盘拨号)。
这样做主要是为了使用户能够独立地控制每个流的音量。
多数的流仅限于系统事件,所以,除非您的应用程序是要更换闹钟,否则几乎可以肯定的是使用STREAM_MUSIC音频流。
使用硬件音量按键来控制应用程序的音量
默认情况下,按音量键控制修改当前获得焦点的音频流的音量。假如您的应用程序当前不是正在播放音乐,或者没有运行,那么音量键将会调整振铃的音量。
如果您有一个游戏或音乐应用程序,当用户点击音量键的时候,即使他们目前正在浏览歌曲,或者没有停留在当前的音乐游戏的位置,他们仍然希望控制游戏或音乐的音量。
您可以通过接收音量控制键的按键消息来修改当前的音频流音量。不过不用那么麻烦 ,Android 已经提供了方便的 setVolumeControlStream() 方法来根据您指定的音频流来自动调节音量。
首先确定您的应用程序将使用的音频流,然后通过 setVolumeControlStream 方法设置其为当前焦点的音频流。
这个方法应该被及早调用,并且在生命周期中只需要调用一次即可,所以通常应在 Activity或者 Fragment的 OnCreate() 内 调用。
这将确保只要你的应用程序是可见状态的,音量控制功能就是用户所期望的效果(即控制当前应用程序的音量)。
代码示例:
- setVolumeControlStream(AudioManager.STREAM_MUSIC);
从现在开始,按设备上的音量键将影响您指定的(示例“音乐”)的音频流。
使用硬件播放控制按键来控制应用程序的音频播放
很多手机和许多无线耳机都附带有媒体播放控制按钮,如播放,暂停,停止,跳过。每当用户按下这些硬件键,系统就会广播 ACTION_MEDIA_BUTTON 动作。
为了响应媒体按钮的点击事件,您需要注册 BroadcastReceiver 来监听广播。
代码示例:
- <receiver android:name=".RemoteControlReceiver">
- <intent-filter>
- <action android:name="android.intent.action.MEDIA_BUTTON" />
- </intent-filter>
- </receiver>
Receiver 中需要知道到底是按下了哪个键的具体信息,Intent中包括了 EXTRA_KEY_EVENT键值,可以通过它来取得KeyEvent类型的值 ,KeyEvent中的KEYCODE_MEDIA_*静态常量表示了所有的媒体按钮类型,如 KEYCODE_MEDIA_PLAY_PAUSE 和 KEYCODE_MEDIA_NEXT等等。
代码示例:
- public class RemoteControlReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
- KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
- if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) {
- // Handle key press.
- // 处理播放按键的消息
- }
- }
- }
- }
因为多个应用程序可能会接听和响应媒体按键消息,您必须以编程方式控制您的应用程序何时应该接受媒体按钮事件。
在您的应用程序中可以使用 AudioManager 来注册和取消注册媒体按钮的事件接收器,注册时,使用您的专用事件接收器。
示例代码 :
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
...
// Start listening for button presses 开始 监 听
am.registerMediaButtonEventReceiver(RemoteControlReceiver);
...
// Stop listening for button presses 取消 监 听
am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
通常情况下,应用程序在失去焦点或不在屏幕显示隐藏到后台的时候, 应注销其大部分的接听器(如在 onStop()回调函数中) 。
然而,对于媒体播放应用程序却没有这么简单,事实上,最重要的是,当您的应用程序是处于不可见的状态时,此时不能由屏幕上的 UI 控制,但是仍然需要响应媒体播放控制按钮(最典型的就是后台播放音乐) 。
所以,一个更好的方法是:当您的应用程序获得和失去音频焦点的时候分别注册和注销媒体按钮的事件接收器,而不仅仅是依赖于应用程序的界面状态 。
具体方案请参考下一节课程。
参考文摘:
https://developer.android.com/training/managing-audio/volume-playback.html
Android音乐编程:管理音频焦点的更多相关文章
- 【Android Developers Training】 43. 序言:管理音频播放
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Android音频焦点详解(上)
转载请注明出处:http://www.cnblogs.com/landptf/p/6384112.html 2017年开年第一篇博客,很早就想总结一下Android音频的相关知识.今天我们先来看一下音 ...
- Android多媒体-MediaPlayer唤醒锁及音频焦点
MediaPlayer的唤醒锁 一般使用MediaPlayer播放音频流,推荐使用一个Service来承载MediaPlayer,而不是直接在Activity里使用.可是Android系统的功耗设计里 ...
- 【Android Developers Training】 45. 控制音频焦点
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Android音频焦点处理相关的方法
有这么一种场景:你打开qq音乐.优酷客户端.视频播放的时候.这个时候突然来电显示了,此时所有的MediaPlayer相关的服务或者响应都进入"休眠"状态.那么,这个功能是怎么实现的 ...
- android 音频焦点
音频焦点分为两种 1永久占用((AudioManager) getSystemService(AUDIO_SERVICE)) .requestAudioFocus(null, AudioManager ...
- Qt on Android 核心编程
Qt on Android 核心编程(最好看的Qt编程书!CSDN博主foruok倾力奉献!) 安晓辉 著 ISBN 978-7-121-24457-5 2015年1月出版 定价:65.00元 4 ...
- Android高级编程笔记(四)深入探讨Activity(转)
在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一 ...
- 《Qt on Android核心编程》介绍
<Qt on Android核心编程>最终尘埃落定.付梓印刷了. 2014-11-02更新:china-pub的预售链接出来了.折扣非常低哦. 封面 看看封面的效果吧,历经几版,最终就成了 ...
随机推荐
- hdu 5493 Queue treap实现将元素快速插入到第i个位置
input T 1<=T<=1000 n 1<=n<=100000 h1 k1 h2 k2 ... ... hn kn 1<=hi<=1e9 0<=ki&l ...
- #ifdef,#else,#endif,#if 拾忆
预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作.说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译.这样做的好处是,经过处理后的代码,将会变的很精短. ...
- Strusts2--课程笔记5
数据验证: 输入验证分为客户端验证与服务器端验证.客户端验证主要通过JavaScript脚本进行,而服务器端验证主要是通过Java代码进行验证. 分为以下四种情况: (1)手工编写代码,对所有Ac ...
- C#项目转php工作记录
1.Visual Studio Ultimate 2012 静态激活密钥 RBCXF-CVBGR-382MK-DFHJ4-C69G8 http://blog.csdn.net/jpzy520/arti ...
- Java C# .net 和 C C++ 跨平台的区别
当前主流的手机平台很多,而各个主流的平台的语言支持大同小异:如 1.windows系统WP8上主要支持 VB, C#, c/c++, 2.苹果系统ios上支持 object-c, c/c++ 3.an ...
- A框架 第三步 先加载父类,如果加载子类.立马报错.里面继承的父类还没有导入
先导入 超级父类 如object.php ----controller.php 框架文件中 后导入 当前请求的controller的抽象父类(controller_abstract) 最后 导入 ...
- 第3章 Java语言基础----成员变量与局部变量
在对局部变量进行赋值时,不能对非静态字段age进行静态引用,图1错误,加上static后图二正确,图3与图4类似,如下图所示: 图1图2 图3图4 2.成员变量times在类中定义,局部变量times ...
- connectVisualVMtoTomcat
connectVisualVMtoTomcat 抱ラ花瘠 荬捻怵 鞅讣囚 骝珈 名诡氩 祉逦戳阜 骚须ⅳ 破竹的从骑士的肩甲出切了下去嚓 闼原 奇荛糠 社獭池 杨叔你养的这些望月螓 ...
- Linux文件系统中硬链接和软链接的区别 (转)
建立硬链接命令:ln src-link dest-link建立软链接:ln -s src-link dest-link 1. 硬链接是别名,软链接是快捷方式 2. 硬链接和源链接指向同一个i节 ...
- 自定义cell,根据数据源,要对cell的布局进行调整,没有实现调整的相应效果
自定义cell,用于两种显示情况,首次进来A种情况(主材页面),正确显示,然后切换B种情况(辅材情况),可以正确显示,但是当再次切换回A种情况(主材情况)的时候,主材cell不能正常显示了,遗留的B中 ...