在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(); }