Android后台监听耳机(线控、蓝牙)按键事件

在Activity中重写onKeyDown、onKeyUp这些方法只适用于APP在前台的情况,如果将APP切换到后台就失效了。

经过网上一番摸索、读源码,终于把这个功能整出来了,说一下我的实现过程。
1.后台要获取到事件第一事件想到的肯定是广播,于是就找到了“android.intent.action.MEDIA_BUTTON”这个广播

2.注册监听这个广播后发现…这个广播压根接收不到啊,网上找了半天,有很多叫添加优先级(priority)的,可根本没用。。。

3.但功夫不负有心人,找到一篇10年前的文章,有兴趣可以看一下
https://blog.csdn.net/qinjuning/article/details/6938436
文章里说需要使用AudioManager对象注册一个MediaoButtonRecevie,让这个监听器成为MEDIA_BUTTON的唯一接收器(顾名思义就是只有你的APP可以收到这个广播)

	  //获得AudioManager对象
	  AudioManager mAudioManager =(AudioManager)getSystemService(Context.AUDIO_SERVICE);	 
	  //构造一个ComponentName,指向MediaoButtonReceiver类
	  //下面为了叙述方便,我直接使用ComponentName类来替代MediaoButtonReceiver类
	  ComponentName  mbCN = new ComponentName(getPackageName(),MediaButtonReceiver.class.getName());
	  //注册一个MedioButtonReceiver广播监听
	  mAudioManager.registerMediaButtonEventReceiver(mbCN);
	  //取消注册的方法
	  mAudioManager.unregisterMediaButtonEventReceiver(mbCN);

4.但是这个方法已经过时了(毕竟是10年前的文章),通过源码得知registerMediaButtonEventReceiver这个方法被
MediaSession.setMediaButtonReceiver替代了

@deprecated Use {@link MediaSession#setMediaButtonReceiver(PendingIntent)} instead.

5.又一番摸索后,找到了MediaSessionCompat这个类,具体的实现方法如下(注意要在Service中注册监听哦)

    private MediaSessionCompat mMediaSession;
    @Override
    public void onCreate() {
        super.onCreate();
        ComponentName mbr = new ComponentName(getPackageName(), MusicIntentReceiver.class.getName());
        mMediaSession = new MediaSessionCompat(this, "mbr", mbr, null);
        mMediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
                MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
        mMediaSession.setCallback(new MediaSessionCompat.Callback() {
            @Override
            public boolean onMediaButtonEvent(Intent intent) {
                //在这里就可以接收到(线控、蓝牙耳机的按键事件了)
                
                //通过intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);获取按下的按键实现自己对应功能       
          
                //返回true表示不让别的程序继续处理这个广播
                return true;
            }
        });
        if (!mMediaSession.isActive()) {
            mMediaSession.setActive(true);
        }
    }

    //别忘了在onDestroy()中释放mediaSession
    @Override
    public void onDestroy() {
        mMediaSession.release();
        super.onDestroy();
    }
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值