mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); ComponentName rec = new ComponentName(getPackageName(),MediaButtonIntentReceiver.class.getName()); mAudioManager.registerMediaButtonEventReceiver(rec);
先 注册 MediaButton的 Receiver
然后获取焦点 Listener 里面没有实现 。 只是看了下状态。
mAudioManager.requestAudioFocus(new OnAudioFocusChangeListener() { @Override public void onAudioFocusChange(int focusChange) { //操作待定 switch (focusChange) { case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: // Pause playback SystemLog.error(CLASS_NAME, "onAudioFocusChange", "AUDIOFOCUS_LOSS_TRANSIENT"); break; case AudioManager.AUDIOFOCUS_LOSS: // am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); // am.abandonAudioFocus(afChangeListener); // // Stop playback SystemLog.error(CLASS_NAME, "onAudioFocusChange", "AUDIOFOCUS_LOSS"); break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: // Lower the volume SystemLog.error(CLASS_NAME, "onAudioFocusChange", "AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK"); break; case AudioManager.AUDIOFOCUS_GAIN: // Resume playback or Raise it back to normal SystemLog.error(CLASS_NAME, "onAudioFocusChange", "AUDIOFOCUS_GAIN"); break; } } } , AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);//AudioManager.AUDIOFOCUS_GAIN持续获取焦点
使 当前的 receiver 持续获得焦点。 这样可以 防止
AudioManager 焦点暂时丢失后 被系统播放器
或者QQ音乐什么的 获取Audio焦点。焦点被夺后,耳机按键事件会被其他播放器拦截。 因为mAudioManager.registerMediaButtonEventReceiver 注册后
会把receiver放到
内部的stack中。
当mAudioManager收到 MediaButton广播时如果stack不为空只发送给
栈顶 receiver。如果为空则
发送广播 ,使所有 监听 MediaButton Action的Receiver 。