资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: 计算机考试归档 最新发布

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();
    }
转载请注明:文章转载自 http://www.konglu.com/
本文地址:http://www.konglu.com/it/353366.html
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【Android后台监听耳机(线控、蓝牙)按键事件】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2