Android开发中audio focus的处理

来源:互联网 发布:零基础java就业班 编辑:程序博客网 时间:2024/05/18 00:39

        Android从2008年推出至今已有4年多,我最近才上手了android开发,我已经属于了开发者中的小弟了,有很多前辈在这系统上做了很多深入的开发和研究。http://developer.android.com 作为Android开发官网,上面有比较详细的介绍,可惜是英文的,我辈还是需要花点力气去读读的,上面将media & camera分成了5个部分,

  1. Media playback
  2. Supported Media Formats
  3. Audio Capture
  4. JetPlayer
  5. Camera

        这次我先分享下Media Playback的中一些内容以及我学习中的感悟。

        首先需要我们接触到的最主要的两个类分别是MediaPlayer、MediaManager。MediaPlayer是用来控制音频/视频流或者文件的播放的,需要我们注意的是MediaPlayer对象加上其支持的一些播放操作会形成一个状态机,在不合适的状态调用不合适的函数就会抛出异常,如果开发者不清楚自己创建的MediaPlayer对象当前处于哪个状态,就很有可能调用错误的方法造成程序的异常,而且这些错误很难被察觉,所以错误处理在这个部分就显得尤为重要。



        下面要说的就是Audio Focus,举个例子,当你在听歌的时候,突然来了一条短信,如果不加处理,短信的声音很可能被音乐的声音湮没,你就会察觉不到。我们希望发生什么事情呢?我们希望这个时候音乐的声音较之前稍微降低些使得我们能够听到短信提示音,在短信提示音结束后音乐的声音再次回到正常。这个过程就是获取和释放audio focus的过程。

申请audio focus

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,    AudioManager.AUDIOFOCUS_GAIN);

处理focus change事件

class MyService extends Service                implements AudioManager.OnAudioFocusChangeListener {    // ....    public void onAudioFocusChange(int focusChange) {        // Do something based on focus change...    }}
在写代码的时候,我忽略了一点:Audio Focus is cooperative in nature.

        申请audio focus和处理focus change一定是互相配合实现的,我一开始写了个service用来播放音乐,在start函数调用前并没有申请audio focus,但是我实现了onAudioFocusChange函数。我期待这个service在focus change时停止播放,但是我发现,当另外一个service申请到audio focus时,之前的service不会出现音乐停止播放的情况。

        后来想了下,实际上这是很正常的。如果我的service在播放音乐之前没有去申请获得audio focus,那么之后audio focus被别的程序修改了,那么service中对于audio focus变化的处理实际上是不会得到执行的。如果要使得处理focus change的事件能够得到执行,首先我得确保service开始就申请了audio focus。