Android通过AudioFocus机制对音频焦点进行管理

Android通过AudioFocus机制对音频焦点进行管理。

Music通过下述代码申请Focus权限:

AudioManager mAudioManager;
mAudioManager.requestAudioFocus(mAudioFocusListener, AudioManager.STREAM_MUSIC,AudioManager.AUDIOFOCUS_GAIN);

1、关于参数:mAudioFocusListener   就是音频焦点变化时的监听器,这是音频焦点控制的重点
其中mAudioFocusListener 注册了 OnAudioFocusChangeListener 的监听;

private OnAudioFocusChangeListener mAudioFocusListener = new OnAudioFocusChangeListener() {
        public void onAudioFocusChange(int focusChange) {
            Log.d(TAG, " foucs change");
            //做焦点变化的处理逻辑
            mHandler.obtainMessage(FOCUSCHANGE, focusChange, 0).sendToTarget();
        }
    };
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {

            case FOCUSCHANGE:
            switch (msg.arg1) {
                case AudioManager.AUDIOFOCUS_LOSS:
                    //失去焦点,暂停处理,暂停播放当前音乐
                    //你会长时间的失去焦点,所以不要指望在短时间内能获得。请结束自己的相关音频工作并做好收尾工作。比如另外一个音乐播放器开始播放音乐了,前提是这个另外的音乐播放器他也实现了音频焦点的控制,
                    break;
                case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                    //你的焦点会短暂失去,但是你可以与新的使用者共同使用音频焦点
                    break;
                case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                    //你会短暂的失去音频焦点,你可以暂停音乐,但不要释放资源,因为你一会就可以夺回焦点并继续使用
                    //如听音乐过程中,收到电话
                    break;
                case AudioManager.AUDIOFOCUS_GAIN:
                    //播放操作
                    //你已经完全获得了音频焦点
                    break;
                default:
                    Log.d(TAG, "Unknown audio focus change code");
            }
            break;
        }
    }

     
2、关于参数:AudioManager.STREAM_MUSIC  表示焦点获得之后的数据传输类型,包含以下类型:

STREAM_ALARM 警报
STREAM_MUSIC 音乐回放即媒体音量
STREAM_NOTIFICATION 窗口顶部状态栏Notification,
STREAM_RING 铃声
STREAM_SYSTEM 系统
STREAM_VOICE_CALL 通话
STREAM_DTMF 双音多频,不是很明白什么东西

3、关于参数:AudioManager.AUDIOFOCUS_GAIN    告知系统,你要求获得音频焦点的用途,系统根据你所要求的类型来给其他监听者发出相应的焦点控制参数

AUDIOFOCUS_GAIN_TRANSIENT:只是短暂获得,一会就释放焦点,比如你只是想发个notification时用下一秒不到的铃声。
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:只是背景获得,之前的音频焦点使用者无需释放焦点给,可与其共同使用。
AUDIOFOCUS_GAIN:我要求完全获得焦点,其他人需要释放焦点。比如我要播放音乐了,这时就要抢占整个音频焦点。

在进行音频开发时,最好遵循audio机制,不然会给用户带来不好的体验。

你可能感兴趣的:(Audio,android,audiofocus)