读书频道 > 网站 > 网页设计 > 深入理解Android:卷III
3.4.1AudioFocus最简单的例子
15-08-21    下载编辑
收藏    我要投稿   

本文所属图书 > 深入理解Android:卷III

本书在逻辑上分为4个部分Part 01(第1-2章):这是本书的基础部分,首先介绍了Android源码环境的搭建、编译和调试;然后讲解了Android进程间通信与任务调度的工具Binder与MessageQueue 这两项基础工作是深入研究立即去当当网订购
AudioFocus相关的API一共有三个,分别是requestAudioFocus()、abandonAudioFocus()以及AudioFocusListener回调接口,它们分别负责AudioFocus的申请、释放以及变化通知。
 
为了让大家了解AudioFocus的实现原理,我们先来看一个AudioFocus使用方法。下面是一个播放器的部分代码:
 
publicvoidplay(){
    // 在开始播放前,先申请AudioFocus,注意传入的参数
    int result = mAudioManager.requestAudioFocus(
                                 mAudioFocusListener,AudioManager.STREAM_MUSIC,
                                 AudioManager.AUDIOFOCUS_GAIN);
    // 只有成功申请到AudioFocus之后才能开始播放
    if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED)
         mMediaPlayer.start();
    else // 申请失败,如果系统没有问题,这一定是正在通话过程中,所以,还是不要播放了
        showMessageCannotStartPlaybackDuringACall();
}

public void stop() {
     // 停止播放时,需要释放AudioFocus
     mAudioManager.abandonAudioFocus(mAudioFocusListener);
}

 

 
在开始播放前,应用首先要申请AudioFocus。申请AudioFocus时传入了3个参数。
 
mAudioFocusListener:参数名为l。AudioFocus变化通知回调。当AudioFocus被其他AudioFocus使用者抢走或归还时将通过这个回调对象进行通知。
 
AudioManager.STREAM_MUSIC: 参数名为streamType。这个参数表明了申请者即将使用哪种流类型进行播放。目前这个参数仅提供一项信息而已,对AudioFocus的机制没有任何影响,不过Android在后续的升级中可能会使用此参数。
 
AudioManager.AUDIOFOCUS_GAIN: 参数名为durationHint。这个参数指明了申请者将拥有这个AudioFocus多长时间。例子中传入的AUDIOFOCUS_GAIN表明了申请者将长期占用这个AudioFocus。另外还有两个可能的取值,它们是AUDIOFOCUS_GAIN_TRANSIENT和AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK。这两个取值的含义都表明申请者将暂时占用AudioFocus,不同的是,后者还指示了即将被申请者抢走AudioFocus的使用者不需要暂停,只要降低一下音量就可以了(这就是“DUCK”的意思)。
 
在停止播放时,需要调用abandonAudioFocus释放AudioFocus,会将其归还给之前被抢 走AudioFocus的那个使用者。
 
接下来,我们看一下mAudioFocusListener是如何实现的。
 
private onAudioFocusChangeListenermAudioFocusListener =
                                                            newOnAudioFocusChangeListener(){
     // 当AudioFocus发生变化时,这个函数将会被调用。其中参数focusChange指示发生了什么变化
    publicvoidonAudioFocusChange(int focusChange){
        switch(focusChange) {
            // AudioFocus被长期夺走,需要中止播放,并释放AudioFocus
            // 这种情况对应于抢走AudioFocus的申请者使用了AUDIOFOCUS_GAIN
            case AUDIOFOCUS_LOSS:
                 stop();
                 break;
           // AudioFocus被临时夺走,不久就会被归还,只需要暂停,AudioFocus被归还后再恢
              复播放
           // 这对应于抢走AudioFocus的申请者使用了AUDIOFOCUS_GAIN_TRANSIENT
           case AUDIOFOCUS_LOSS_TRANSIENT:
                saveCurrentPlayingState();
                pause();
                break;
           // AudioFocus被临时夺走,允许不暂停,所以降低音量
           // 这对应于抢走AudioFocus的回放实例使用了AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
           case AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                saveCurrentPlayingState();
                setVolume(getVolume()/2);
                break;
           // AudioFocus被归还,这时需要恢复被夺走前的播放状态
           case AUDIOFOCUS_GAIN:
                restorePlayingState();
                break;
           }
}
};

 

从这里能够看出,AudioFocus机制的逻辑是完整而清晰的。理解上述例子以后,相信AudioFocus的工作原理已经浮现在脑海里了吧?如果有兴趣,可以不用着急阅读下面的分析,先思考一下AudioFocus可能的工作原理,然后再与Android的实现进行比较。
 
从调用requestAudioFocus()进行申请到abandonAudioFocus()释放的这段时间内,只能说这个使用者参与了AudioFocus机制,不能保证一直拥有AudioFocus。
点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站