`

android 耳机线控的实现方法

阅读更多
耳机线控的功能
    耳机线控是一种很好用,并且能提升用户体验的功能。可以用来实现一些常用和基本的功能。比如:实现音乐播放的控制,接听电话,音量控制等。下面写一下耳机线控的几种实现方式。

耳机线控的实现
    耳机线控实现方式主要有两种,(注:可能出现无法获取键值的问题,可能导致的原因是:1、驱动不支持;2、按键映射不正确)。
    一种是前台的,前台的,在Activity 里处理,只有该Activity 在前台时才会处理按键。
        重写onKeyUp()、onKeyDown(),它们分别处理放开事件和按下事件;
        代码如下:
       @Override
public boolean onKeyUp(int keyCode, KeyEvent event) {//放开事件处理,keyCode为按键的键值,event 为按键事件的对像,其中包含了按键的信息。
switch(keyCode){
case KeyEvent.KEYCODE_MEDIA_PREVIOUS://耳机三个按键是的上键,注意并不是耳机上的三个按键的物理位置的上下。
//按键功能定义的处理。

case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE://耳机单按键的按键或三按键耳机的中间按键。
case KeyEvent.KEYCODE_HEADSETHOOK://耳机单按键的按键或三按键耳机的中间按键。与上面的按键可能是相同的,具体得看驱动定义。
//按键功能定义的处理。一般与KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE、键的处理一样。

case KeyEvent.KEYCODE_MEDIA_NEXT://耳机三个按键是的下键,
//按键功能定义的处理。


}
return false;//为true,则其它后台按键处理再也无法处理到该按键,为false,则其它后台按键处理可以继续处理该按键事件。
}
        @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {//按下事件处理,同onKeyUp()方法。
switch(keyCode){
case KeyEvent.KEYCODE_MEDIA_PREVIOUS://耳机三个按键是的上键,注意并不是耳机上的三个按键的物理位置的上下。
//按键功能定义的处理。
//一般把功能定义为
//音乐:播放上一首
//视频:播放上一个视频或后退。
//收音机:向上搜索,
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE://耳机单按键的按键或三按键耳机的中间按键。
case KeyEvent.KEYCODE_HEADSETHOOK://耳机单按键的按键或三按键耳机的中间按键。与上面的按键可能是相同的,具体得看驱动定义。
//按键功能定义的处理。一般与KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE、键的处理一样。
//一般把功能定义为:
音乐播放的播放和暂停
case KeyEvent.KEYCODE_MEDIA_NEXT://耳机三个按键是的下键,
//按键功能定义的处理。
//一般把功能定义为:
//音乐:播放下一首
//视频:播放下一个视频或前进。
//收音机:向下搜索,

}
return false;//为true,则其它后台按键处理再也无法处理到该按键,为false,则其它后台按键处理可以继续处理该按键事件。
}
        @Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {长按事件处理,同onKeyUp()方法。有的手机可能无法收到耳机的长按事件。
switch(keyCode){
case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
case KeyEvent.KEYCODE_HEADSETHOOK:
case KeyEvent.KEYCODE_MEDIA_NEXT:
}
return false;
}
   
    另一种是注册监听,监听Intent.ACTION_MEDIA_BUTTON,后台处理按键事件,有优先级,有可能被拦截,接收不到按键事件。
    实现方式如下:
    1、注册监听Intent.ACTION_MEDIA_BUTTON,代码如下:

    IntentFilter mediafilter = new IntentFilter();
        //拦截按键KeyEvent.KEYCODE_MEDIA_NEXT、KeyEvent.KEYCODE_MEDIA_PREVIOUS、KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE
        mediafilter.addAction(Intent.ACTION_MEDIA_BUTTON);
        mediafilter.setPriority(100);//设置优先级,优先级太低可能被拦截,收不到信息。一般默认优先级为0,通话优先级为1,该优先级的值域是-1000到1000。
        registerReceiver(mediaButtonReceiver, mediafilter);


    2、处理广播信息。
        private BroadcastReceiver mediaButtonReceiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
boolean isActionMediaButton = Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction());  //判断是不是耳机按键事件
                         if(!isActionMediaButton) return; 
         KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);  //判断有没有耳机按键事件
         if(event==null) return; 
            //过滤按下事件
         boolean isActionUp = (event.getAction()==KeyEvent.ACTION_UP); 
         if(!isActionUp) return; 
           //避免在Receiver里做长时间的处理,使得程序在CPU使用率过高的情况下出错,把信息发给handlera处理。
         int keyCode = event.getKeyCode(); 
         long eventTime = event.getEventTime()-event.getDownTime();//按键按下到松开的时长 
         Message msg = Message.obtain(); 
         msg.what = 100; 
         Bundle data = new Bundle(); 
         data.putInt("key_code", keyCode); 
         data.putLong("event_time", eventTime); 
         msg.setData(data); 
         handler.sendMessage(msg); 
          
         //终止广播(不让别的程序收到此广播,免受干扰) 
         abortBroadcast();
}
};
    3、在handler中处理按键事件。
private Handler handler = new Handler(){
@Override 
     public void handleMessage(Message msg) { 
         int what = msg.what; 
         switch(what){ 
         case 100: 
             Bundle data = msg.getData(); 
             //按键值 
             int keyCode = data.getInt("key_code"); 
             //按键时长 
             long eventTime = data.getLong("event_time"); 
             //设置超过1000毫秒,就触发长按事件  //谷歌把超过1000s定义为长按。
             boolean isLongPress = (eventTime>1000); 
             switch(keyCode){ 
             case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE://播放或暂停 
                 playOrPause(); 
                 break; 
             //短按=播放下一首音乐,长按=音量加 
             case KeyEvent.KEYCODE_MEDIA_NEXT: 
                 if(isLongPress){ 
                     adjustVolume(true);//自定义 
                 }else{ 
                     playNext();//自定义 
                 } 
                 break; 
             //短按=播放上一首音乐,长按=音量减   
             case KeyEvent.KEYCODE_MEDIA_PREVIOUS: 
                 if(isLongPress){ 
                     adjustVolume(false);//自定义 
                 }else{ 
                     playPrevious();//自定义 
                 } 
                break; 
             } 
             break; 
         default://其他消息-则扔回上层处理 
             super.handleMessage(msg); 
         } 
     } 
};
//注:这种方法处理长按之前一定会先执行短按。

分享到:
评论

相关推荐

    Android利用广播实现耳机的线控

    在Android系统中,耳机线控功能的实现是一个重要的部分,特别是在音乐播放、电话接听等应用场景中。本篇文章将深入探讨如何利用广播接收器(BroadcastReceiver)来处理耳机的线控事件,实现单击和双击的识别。 首先...

    耳机线控hook key

    ### 耳机线控Hook Key相关知识点 #### 一、耳机插拔识别与Hook Key用途 **耳机插拔识别**是指设备能够检测到耳机插入或拔出的行为,并据此作出相应的反应,如自动暂停播放音乐或者调整设备状态。这一功能在Android...

    电信设备-线控耳机、移动终端及控制方法.zip

    控制方法方面,线控耳机的控制逻辑可以由硬件直接实现,也可以通过软件来定义。硬件控制通常固定了特定的功能,而软件定义则更灵活,可以通过固件升级或应用程序更新来扩展功能。例如,某些线控可能支持自定义快捷键...

    行业资料-电子功用-双兼容线控耳机控制电路及基于该电路实现的控制方法.pdf的说明分析.rar

    标题中的“行业资料-电子功用-双兼容线控耳机控制电路及基于该电路实现的控制方法.pdf的说明分析.rar”表明这是一个关于电子工程领域的技术文档,主要探讨的是双兼容线控耳机的控制电路设计以及相应的控制方法。...

    使用线控耳机来操控应用功能

    在移动设备日益普及的今天,线控耳机作为一种常见的外设,不仅为用户提供了一种便捷的听音方式,还可以通过集成的功能键来实现对手机应用的控制,极大地提升了用户体验。本文将深入探讨如何利用线控耳机来操控应用...

    SSS1530A3支持接听挂断TypeC线控耳机方案

    它针对Type-C耳机的兼容性问题进行了优化,是具有较高性价比的Type-C耳机线控方案。 SSS1530A3芯片的关键特性包括: 1. 嵌入式Type-C USB FS (Full Speed) 收发器和控制器:能够支持Type-C接口的音频通讯,提供了...

    Android代码-APlayer

    支持耳机线控操作,拔出耳机自动暂停 支持桌面歌词、桌面部件 已适配Android8.0通知栏 锁屏控制,可选择原生或者软件实现 心情可生成海报分享 日夜间模式切换,动态改变主题颜色 监测媒体库变化自动刷新,并且可以手动...

    Android应用源码之音乐播放器videoplayer.zip

    10. **自定义音乐播放控制**:为了提供更好的用户体验,开发者可能会自定义音乐播放控制,例如通过悬浮窗、手势控制或者耳机线控来实现播放操作。 通过分析和学习这个源码,开发者不仅能掌握音乐播放器的基本实现,...

    mp3.rar_android_音乐播放器

    3. **线控切歌功能**:大部分Android设备都配备了耳机线控,线控切歌功能需要适配不同的耳机型号。Android系统提供了AudioManager服务,允许应用监听音频焦点的变化,从而响应线控操作。开发者需要注册...

    《科学脱口秀》Android端的设计与实现.pdf

    7. **通知栏/线控控制**:用户可以通过通知栏或耳机线控来控制音乐播放。 8. **来电/短信勿扰**:在接到来电或短信时,应用会自动暂停播放,避免打扰用户。 9. **收听/点击热度统计**:收集用户收听数据,分析节目的...

    Android仿腾讯轻听音乐播放器,UI美观,功能模块丰富,优秀安卓app设计!

    这是一款优雅的依照Material Design的音乐播放器,UI参考 腾讯轻听 音乐播放器,使用 Lastfm Api ...5、支持耳机线控播放,耳机拔出自动暂停 6、动态刷新媒体库,及时获知媒体文件变更 7、日夜间模式切换,支持动态换肤

    音乐播放器 Android

    - 耳机控制:注册`BroadcastReceiver`监听耳机插拔事件,实现耳机线控的播放/暂停功能。 - 播放列表:允许用户创建和管理播放列表,存储多个曲目信息。 - 背景服务:为了在应用关闭或后台运行时仍能保持音乐播放...

    MIMI音乐(Android源码)

    此外,考虑到用户体验,MIMI音乐可能还实现了后台播放、通知栏控制、耳机线控等功能,这些都是音乐应用的常见特性。开发者需要处理Activity与Service的交互,以及BroadcastReceiver监听耳机插拔等系统事件。 总之,...

    [Android应用开发记录-字幕播放器(5)完善]附属工程,源码

    [Android应用开发记录-字幕播放器(5)完善]...4.拔掉耳机线时自动暂停(Android2.2以上版本) 5.在【正在进行中】画面中表示启动用快捷方式 6.改善(没有解决)定位歌词不准确(选中的歌词的前面一段时间不能播放)

    android音乐播放器

    最后,**多媒体控件**如媒体按钮绑定、耳机线控支持等也需要考虑。通过BroadcastReceiver监听音频焦点的变化,可以实现与其他应用音乐播放的无缝切换。 总的来说,“android音乐播放器”项目涵盖了Android开发的多...

    Android 蓝牙 Audio音频输出通道切换详解_卡音,多年安卓开发经验,从实际项目中获取到的经验,对安卓开发者非常有帮助。

    * isWiredHeadsetOn():检查线控耳机是否连着; * 注意这个方法只是用来判断耳机是否是插入状态,并不能用它的结果来判定当前的 Audio 是通过耳机输出的,这还依赖于其他条件。 强制切换 Audio 输出通道 可以通过 ...

    安卓Android源码——音乐播放器(晴天播放)源码.zip

    同时,它可能还支持媒体按钮(如耳机线控)的远程控制。 5. **音乐播放功能**:包括播放、暂停、停止、上一曲、下一曲、音量控制、播放模式(如单曲循环、列表循环等)等基本操作。 6. **性能优化**:对于音乐播放...

    android音乐播放器和视频播放器源码

    - `MediaSession`:用于在后台控制媒体播放,即使应用不在前台,用户依然可以通过通知栏或耳机线控操作播放器。 - `ForegroundService`:当播放器在后台运行时,使用此服务以防止被系统清理,确保音乐持续播放。 ...

    小米改装 绝对精彩

    在Android系统中,可以找到支持自定义耳机按键功能的应用,如“Volume Button Camera”等,将耳机线控与相机应用关联起来。同时,对于动手能力强的用户,可以直接修改系统文件,将线控按键映射到相机快门。 三、...

    android多媒体编程

    这通常涉及到解析A2DP协议或监听耳机线控事件。 总之,Android多媒体编程涉及音频流选择、音量控制、媒体按键监听、音频焦点管理和设备控制等多个方面。通过合理利用Android提供的API,开发者可以创建出功能完备且...

Global site tag (gtag.js) - Google Analytics