IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android后台监听耳机(线控、蓝牙)按键事件 -> 正文阅读

[移动开发]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();
    }
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-29 13:09:42  更:2021-10-29 13:09:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:00:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码