安卓音频焦点切换总结及案例

上传人:cjc****537 文档编号:34165352 上传时间:2018-02-21 格式:DOCX 页数:5 大小:80.75KB
返回 下载 相关 举报
安卓音频焦点切换总结及案例_第1页
第1页 / 共5页
安卓音频焦点切换总结及案例_第2页
第2页 / 共5页
安卓音频焦点切换总结及案例_第3页
第3页 / 共5页
安卓音频焦点切换总结及案例_第4页
第4页 / 共5页
安卓音频焦点切换总结及案例_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《安卓音频焦点切换总结及案例》由会员分享,可在线阅读,更多相关《安卓音频焦点切换总结及案例(5页珍藏版)》请在金锄头文库上搜索。

1、 安卓音频焦点问题及案例因为系统中可能会有多个应用程序会播放音频,所以需要考虑他们之间该如何交互,为了避免多个应用程序同时播放音乐,Android 系统使用音频焦点来进行统一管理,即只有获得了音频焦点的应用程序才可以播放音乐。 应用程序在开始播放音频文件前,首先应该请求获得音频焦点,并且应该同时注册监听音频焦点的丢失通知,即如果音频焦点被系统或其他的应用程序抢占时,应用程序可以做出合适的响应。 正确对于音频的播放流程如下:1 获取音频焦点 requestAudioFocus2 取成功后,开始播放音频 3 处理音频焦点的丢失和“DUCK”4 播放完毕后取消焦点1.获取音频焦点 当应用程序在开始播

2、放任何音频之前,首先应该持有流的音频焦点。 可以通过调用 requestAudioFocus() 来实现,如果返回 AUDIOFOCUS_REQUEST_GRANTED 则表示请求成功 。 必须指定流类型(使用的是哪一个流)和音频焦点的类型(短暂的或是持久的)。 瞬态焦点用来播放很短时间的音频(例如,播放导航指令)。持久焦点用来播放较长一段时间的音频(例如,播放音乐)。 下面的代码片断演示了请求音乐音频流的永久音频焦点。 例如当用户按下播放背景音乐的按键,您应该立即请求音频焦点,当成功获得了焦点后再开始播放音乐。 AudioManager am = mContext.getSystemServ

3、ice(Context.AUDIO_SERVICE); 1. . 2. 3. / Request audio focus for playback 4. int result = am.requestAudioFocus(afChangeListener, 5. / Use the music stream. 6. AudioManager.STREAM_MUSIC, 7. / Request permanent focus. 8. AudioManager.AUDIOFOCUS_GAIN); 9. 10. if (result = AudioManager.AUDIOFOCUS_REQUES

4、T_GRANTED) 11. am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); 12. / Start playback. 13. / 开始播放音乐文件 14. 如果应用程序完成了播放,请记着要调用 abandonAudioFocus()方法来通知系统释放音频焦点,同时注销相关的 AudioManager.OnAudioFocusChangeListener。这样当应用程序释放了音频焦点,则系统会允许其他被中断的应用程序重新获取该焦点来继续播放。 Java 代码 1. / Abandon audio focus when

5、 playback complete 2. am.abandonAudioFocus(afChangeListener); 当请求瞬态音频焦点时有一个附加参数可供设置,即是否允许 “DUCK”。通常当应用程序失去了音频焦点时应该停止播放。如果获取短暂音频焦点的时候设置了”DUCK” 附加参数,则允许其他的应用程序继续播放,不需要停止,只要降低音量就可以了,然后直到您的应用程序释放了焦点,其他应用程序再重新获得的时候,将音量还原到有一开始的状态。 / Request audio focus for playback 1. int result = am.requestAudioFocus(afC

6、hangeListener, 2. / Use the music stream. 3. AudioManager.STREAM_MUSIC, 4. / Request permanent focus. 5. AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK); 6. 7. if (result = AudioManager.AUDIOFOCUS_REQUEST_GRANTED) 8. / Start playback. 9. “DUCK” 特别适合那种间歇性播放音频流的应用程序,如驾驶导航的声音提示。 每当其他的应用程序请求获得音频焦点(永久性的

7、,短暂的,短暂并且支持 DUCK 的)的时候,您应用程序中注册的音频焦点监听器都会收到相应的消息通知。 2.处理音频焦点的丢失 如果此应用程序可以请求音频焦点,那么当其他应用程序申请的时候,此应用程序也可能会丢失音频焦点。怎么样应对音频焦点丢失的情况则取决于音频焦点丢失的方式。当音频焦点丢失时,注册的监听函数 onAudioFocusChange()会收到一个事件通知,通知中的参数包括了具体的信息,比如是永久焦点丢失,短暂焦点丢失,还是短暂焦点且允许 DUCK 的焦点丢失。 通常,如果是短暂焦点的丢失,应用程序应该暂停当前的播放,但其他状态信息继续保持,并且应该持续监听音频焦点的改变,一旦重新

8、获得了音频焦点,则可以马上恢复到以前的播放状态。 假如是永久焦点的丢失,则通常意味着其他应用程序要长时间播放音频了,应用程序应该停止播放,放弃音频焦点的监听,并注销所有的媒体按钮监听器,从而让获得焦点的其他应用程序来监听媒体播放控制按钮的按键消息。如果要恢复应用程序的播放状态,则通常需要用户重新手动启动播放在应用程序中。 在下面的代码片段中,如果丢失的是短暂音频焦点,则暂定当前应用程序的播放,如果丢失的是永久音频焦点,则停止当前应用程序的播放,停止监听音频焦点的变更,并注销媒体按钮事件的监听。 OnAudioFocusChangeListener afChangeListener = new

9、OnAudioFocusChangeListener() 1. public void onAudioFocusChange(int focusChange) 2. if (focusChange = AUDIOFOCUS_LOSS_TRANSIENT 3. / Pause playback 4. else if (focusChange = AudioManager.AUDIOFOCUS_GAIN) 5. / Resume playback 6. else if (focusChange = AudioManager.AUDIOFOCUS_LOSS) 7. am.unregisterMedi

10、aButtonEventReceiver(RemoteControlReceiver); 8. am.abandonAudioFocus(afChangeListener); 9. / Stop playback 10. 11. 12. ; 13. 如果丢失的短暂音频焦点允许 DUCK 状态,在这种情况下,应用程序可以降低音量继续播放,不需要暂停。 Ducking 时需要降低当前应用程序的音量,从而不会打扰其他应用程序音频的播放。 在下面的代码片段中,当我们失去焦点的时候,降低了媒体播放的音量,重新获得焦点的时候,将音量恢复到原来的状态。 1. OnAudioFocusChangeListen

11、er afChangeListener = new OnAudioFocusChangeListener() 2. public void onAudioFocusChange(int focusChange) 3. if (focusChange = AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK 4. / Lower the volume 5. else if (focusChange = AudioManager.AUDIOFOCUS_GAIN) 6. / Raise it back to normal 7. 8. 9. ; 音频焦点的丢失是非常重要的一种系统状态变

12、化通知,系统会广播很多有关音频状态变化的通知,你的应用程序应该监听这些变化,并作出合适的应对方案,从而提高用户的音乐体验。3.案例:问题现象:反馈关于使用手机百度,当搜索英文时,点击手机百度上面的播放按钮播放(或者不点击播放),不关闭手机百度,然后操作其他的应用使手机百度置于后台。当此时来电话挂断之后和手机其他通知提示音响完之后,会听见一个你搜索的那个英文的音频读音。问题分析:1.看 LOG 的时候发现,当打开百度搜索到英文出现手机百度的那个播放图标时会出现下面的 LOG,就是手机百度会请求系统去申请 AudioFocus。Line 2884: 04-30 15:24:26.319 I/Med

13、iaFocusControl( 950): AudioFocus requestAudioFocus() from android.media.AudioManager42db1e10Handler (com.baidu.zeus.HTML5Audio) 4277d4082.可以从下面看到当来电时,音频焦点会给到铃声流(AudioFocus_For_Phone_Ring_And_Calls),当挂断电话时候会禁止掉(abandonAudioFocus)当前的音频请求。Line 4071: 04-30 15:25:42.459 I/MediaFocusControl( 950): AudioFo

14、cus requestAudioFocus() from AudioFocus_For_Phone_Ring_And_CallsLine 5222: 04-30 15:25:51.449 I/MediaFocusControl( 950): AudioFocus abandonAudioFocus() from AudioFocus_For_Phone_Ring_And_Calls3.因为手机百度之前已经申请了但是并没有禁止掉。所以就会出现通话结束时没有其他的应用占用焦点,系统会重新通知服务里之前申请的(afChangeListener),导致手机百度里面的音频再次播放。经过对比在华为荣耀 6 上面在上述操作下也会出现同样的现象。所以此问题是由于手机百度自己的应用导致上述问题现象的发生。并不是手机自身的系统问题。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > 计算机应用/办公自动化

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号