音频焦点的监听

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值