因为系统中可能会有多个应用程序会播放音频,所以需要考虑他们之间该如何交互,为了避免多个应用程序同时播放音乐,Android 系统使用音频焦点来进行统一管理,即只有获得了音频焦点的应用程序才可以播放音乐。
AD:
您的应用程序在开始播放音频文件前,首先应该请求获得音频焦点,并且应该同时注册监听音频焦点的丢失通知,即如果音频焦点被系统或其他的应用程序抢占时,您的应用程序可以做出合适的响应。
获取音频焦点
您的应用程序在开始播放任何音频之前,首先应该持有流的音频焦点。
可以通过调用 requestAudioFocus() 来实现,如果请求成功,返回 AUDIOFOCUS_REQUEST_GRANTED 。
您必须指定流类型(使用的是哪一个流)和音频焦点的类型(短暂的或是持久的)。
瞬态焦点用来播放很短时间的音频(例如,播放导航指令)。
持久焦点用来播放较长一段时间的音频(例如,播放音乐)。
下面的代码片断演示了请求音乐音频流的永久音频焦点。
例如当用户按下播放背景音乐的按键,您应该立即请求音频焦点,当成功获得了焦点后再开始播放音乐。
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
...
// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,
// Use the music stream.
AudioManager.STREAM_MUSIC,
// Request permanent focus.
AudioManager.AUDIOFOCUS_GAIN);
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
// Start playback.
// 开始播放音乐文件
}
一旦您的应用程序完成了播放,请记得要调用 abandonAudioFocus() 方法来通知系统释放音频焦点,同时注销相关的 AudioManager.OnAudioFocusChangeListener 。这样当您的应用程序释放了音频焦点,则系统会允许其他被中断的应用程序重新获取该焦点来继续播放。
// Abandon audio focus when playback complete
am.abandonAudioFocus(afChangeListener);
当请求瞬态音频焦点时有一个附加参数可供设置,即是否允许 “DUCK”。通常当应用程序失去了音频焦点时应该停止播放。如果获取短暂音频焦点的时候设置了”DUCK” 附加参数,则允许其他的应用程序继续播放,不需要停止,只要降低音量就可以了,然后直到您的应用程序释放了焦点,其他应用程序再重新获得的时候,将音量还 原到有一开始的状态。
// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,
// Use the music stream.
AudioManager.STREAM_MUSIC,
// Request permanent focus.
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
// Start playback.
}
“DUCK” 特别适合那种间歇性播放音频流的应用程序,如驾驶导航的声音提示。
每当其他的应用程序请求获得音频焦点(永久性的,短暂的,短暂并且支持DUCK的)的时候,您应用程序中注册的音频焦点监听器都会收到相应的消息通知。
处理音频焦点的丢失
如果您的应用程序可以请求音频焦点,那么当其他应用程序申请的时候,您的应用程序也可能会丢失音频焦点。怎么样应对音频焦点丢失的情况则取决于音频焦点丢失的方式。
当音频焦点丢失时,您注册的监听函数onAudioFocusChange()会收到一个事件通知,通知中的参数包括了具体的信息,比如是永久焦点丢失,短暂焦点丢失,还是短暂焦点且允许DUCK的焦点丢失。
通常,如果是短暂焦点的丢失,您的应用程序应该暂停当前的播放,但其他状态信息继续保持,并且应该持续监听音频焦点的改变,一旦重新获得了音频焦点,则可以马上恢复到以前的播放状态。
假如是永久焦点的丢失,则通常意味着其他应用程序要长时间播放音频了,您的应用程序应该停止播放,放弃音频焦点的监听,并注销所有的媒体按钮监听 器,从而让获得焦点的其他应用程序来监听媒体播放控制按钮的按键消息。如果要恢复您应用程序的播放状态,则通常需要用户重新启动您的应用程序。
在下面的代码片段中,如果丢失的是短暂音频焦点,则暂定当前应用程序的播放,如果丢失的是永久音频焦点,则停止当前应用程序的播放,停止监听音频焦点的变更,并注销媒体按钮事件的监听。
OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT
// Pause playback
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
// Resume playback
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
am.abandonAudioFocus(afChangeListener);
// Stop playback
}
}
};
如果丢失的短暂音频焦点允许DUCK状态,在这种情况下,应用程序降低音量继续播放,不需要暂停。
Duck!
DUCK:降低您应用程序的音量,从而不会打扰其他应用程序音频的播放。
在下面的代码片段中,当我们失去焦点的时候,降低了媒体播放的音量,重新获得焦点的时候,将音量恢复到原来的状态。
OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK
// Lower the volume
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
// Raise it back to normal
}
}
};
音频焦点的丢失是非常重要的一种系统状态变化通知,系统会广播很多有关音频状态变化的通知,您的应用程序应该监听这些变化,并作出合适的应对方案,从而提高用户的音乐体验。
参考文摘:
http://developer.android.com/training/managing-audio/audio-focus.html
分享到:
相关推荐
Android 蓝牙 音频焦点(Audio Focus)——卡音,多年安卓开发经验,从实际项目中获取到的经验,对安卓开发者非常有帮助。
主要为大家详细介绍了Android videoview抢占焦点的处理方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
所以它不适合用来频繁播放小音频文件,比如控件焦点、点击时需要播放小音频文件,这个时候用SoundPool来播放音频文件,比用MediaPlayer来播放效率要高很多。这里也来说说,如果用MediaPlayer来播放小音频文件的话,...
支持Android 5.0+ 支持在线歌曲下载 歌词播放、桌面歌词、桌面小控件 通知栏控制、线控播放、音频焦点控制 QQ登录、在线歌单同步 百度电台列表,网易云mv排行榜,mv播放评论 酷狗歌词搜索、修改歌词样式
>如何使用Android的图形的API(画布,OpenGL ES的1.0/1.1),音频,和 用户输入,以反映这些基本面 >如何从头开发两个2D游戏的基础上,画布的API和OpenGL ES。 >如何创建一个全功能的3D游戏 >如何发布你的游戏,...
由于启动VOIP通信而暂时失去音频焦点时,该演示将触发MediaRecorder。 录音进行后,将手动停止。 然后调用MediaPlayer播放记录的文件。 建造 可以使用Android Studio构建该项目,并且没有其他依赖项。
自动监听audiofocuschange事件,暂时失去焦点时暂停,恢复焦点时继续录制. 增加6.0以下系统的录音权限判断,没有录音权限时,内部会发出一个没有权限的event,自行处理(比如,可以弹窗提示,让用户去"权限管理"界面打开...
Android 一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导开发 IOS 由苹果公司开发的移动操作系统 Webkit 一个开源的浏览器引擎,在手机上的...
MiwokApp 这个程序基本上是多屏应用程序。它给出了实现意图的想法,并提供了如何使用片段的知识。它是如何在android中使用音频焦点和适配器的一个很好的例子。
其中涵盖了, AB播放/循环位置单元/间隔/循环变速播放媒体队列管理变速播放媒体队列管理媒体服务/绑定音频后台/通知栏控制媒体按键自定义处理音频焦点管理媒体引擎切换/扩展...等功能的快速实现。以及,对视频播放...
要完整演示应用程序的所有部分,我通常单击“启用隐藏功能”,然后确保启用以下内容: Android 通知操作笔记(演示提供自定义笔记) Spotify(启用从眼镜控制电话音频播放和音量) 任务(演示提供自定义任务) ...
当音频或视频媒体正在播放并且播放器的窗口没有聚焦时(例如:收听背景音频,或在观看视频时通过按“主页”按钮),会添加另一个通知来控制播放器的重新播放或重新调整播放器的焦点窗户。 尽管存在其他来从野外...
音频焦点/耳机管理 没有任何互联网连接 从头开始Kotlin 模块化,基于功能的架构 无圆角 将来可能会出现: 艺术家图像 歌手歌曲 黑色主题 自定义口音 播放清单 喜欢的歌曲 更多通知动作 曲目间滑动功能 更好的边对边...
iplayerAndroid media player library....功能可配置:内置音频、视频两个Manager,除现有默认功能外,可以通过config配置其他功能,如线控等焦点、锁屏监听等;高度可扩展:所有模块化功能接口,均可以自定义实现
通过GPM禁用音频焦点 替换应用程序中的任何图像,例如封面和艺术家图像 项目状态 当我最近切换到Spotify时,大学和其他项目占用了我的大部分时间,所以我放弃了这个项目。 此外,随着Google发布YT Music,我希望...
调用audioRecord.startRecording(),但不读取音频缓冲区。 拥有麦克风访问权限,应阻止用户应用获取麦克风焦点。 系统电话将覆盖干扰器并将其从麦克风上撞开。 添加通知以提醒在后台运行。 经过测试并阻止了...
我们以原创的内容、全新的视觉设计、视频与音频结合的多媒体形式,为热爱电影的你带来全新的阅读体验。我们力求趣味和深度、娱乐和审美的结合,更强调真诚与真实的批评态度。这是一本只说真话的电影杂志,这是一本有...
在离开窗口时清除/保存焦点历史,焦点在父文件夹项目上 图片幻灯片修复(Estuary) 订阅控制器安装事件(游戏) 修复单选按钮文本长度(Estuary) 修复视频插件的季节/剧集格式(视频) 不要认为显示模式ids...
使用下一首/上一首曲目浏览通知使用暂停/播放按钮删除通知使用前进按钮关闭通知流可能有助于将焦点重新恢复到先前播放的音频。 要测试您的媒体设备(汽车收音机)是否支持AVRCP 1.3,请播放一首设置了id3信息的mp3...