AUDIOFOCUS_GAIN_TRANSIENT:获取的短暂的焦点,就是告知被剥夺者,你很快会重获焦点。对应AUDIOFOCUS_LOSS_TRANSIENT
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:获取焦点,告知被剥夺者,你可以继续播放并将音量降为0或者低音量播放。对应AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK
AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE:获取短暂焦点,但非常期望没有其他声音在播放。这个没有对应的loss标志。
AUDIOFOCUS_GAIN:获取较长期的焦点,对应AUDIOFOCUS_LOSS;
原文参考:https://blog.csdn.net/b1480521874/article/details/54669032
public class MainActivity extends AppCompatActivity {
public static String TAG=MainActivity.class.getName();
private AudioManager audioManager;
private AudioManager.OnAudioFocusChangeListener changeListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
sendMediaButton(this, KeyEvent.KEYCODE_MEDIA_PAUSE);
}
public void sendMediaButton(Context context, int keyCode) {
//先判断后台是否再播放音乐
/*if (audioManager.isMusicActive()) {
KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode);
Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON);
intent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
context.sendOrderedBroadcast(intent, null);
keyEvent = new KeyEvent(KeyEvent.ACTION_UP, keyCode);
intent = new Intent(Intent.ACTION_MEDIA_BUTTON);
intent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
context.sendOrderedBroadcast(intent, null);
}*/
changeListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int i) {
switch (i) {
//会长时间失去,所以告知下面的判断,获得焦点后不要自动播放
case AudioManager.AUDIOFOCUS_LOSS:
Log.i(TAG,"AudioManager.AUDIOFOCUS_LOSS");
break;
//别的播放
//短暂失去焦点,先暂停。同时将标志位置成重新获得焦点后就开始播放
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
Log.i(TAG,"AudioManager.AUDIOFOCUS_LOSS_TRANSIENT");
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
Log.i(TAG,"AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK");
break;
//重新获得焦点,且符合播放条件,开始播放
case AudioManager.AUDIOFOCUS_GAIN:
Log.i(TAG,"AudioManager.AUDIOFOCUS_GAIN");
break;
}
}
};
// AudioManager.AUDIOFOCUS_LOSS_TRANSIENT-->AudioManager.AUDIOFOCUS_GAIN
audioManager.requestAudioFocus(changeListener, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
audioManager.requestAudioFocus(changeListener, AudioManager.STREAM_ALARM, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
audioManager.requestAudioFocus(changeListener, AudioManager.STREAM_RING, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
audioManager.requestAudioFocus(changeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
}
@Override
protected void onDestroy() {
super.onDestroy();
audioManager.abandonAudioFocus(changeListener);
}
}
高版本的监听(26以上)
AudioFocusRequest.Builder builder = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
builder.setOnAudioFocusChangeListener(new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
}
});
mAudioManager.requestAudioFocus(builder.build());
对应的
发起方强制获取AUDIOFOCUS_GAIN 接收方只会接收到AudioManager.AUDIOFOCUS_LOSS
发起方短暂获取AUDIOFOCUS_GAIN_TRANSIENT接收方在发起方发起时会触发AUDIOFOCUS_LOSS_TRANSIENT,以及恢复的时候会触发AudioManager.AUDIOFOCUS_GAIN