[android]使用线控耳机来操控应用功能

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

 

 

实现原理:通过广播拦截来实现。

 

(一)定义1个广播拦截器,用来拦截线控耳机按键产生的广播事件。

 

Java代码  收藏代码
  1. import android.content.BroadcastReceiver;  
  2. import android.content.Context;  
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.os.Message;  
  7. import android.util.Log;  
  8. import android.view.KeyEvent;  
  9.   
  10. public class MediaButtonReceiver extends BroadcastReceiver {  
  11.       
  12.     /** 
  13.      * Handler 
  14.      */  
  15.     private Handler handler;  
  16.       
  17.     /** 
  18.      * 构造器. 
  19.      * @param handler 
  20.      */  
  21.     public MediaButtonReceiver(Handler handler) {  
  22.         this.handler = handler;  
  23.     }  
  24.   
  25.     @Override  
  26.     public void onReceive(Context context, Intent intent) {  
  27.         boolean isActionMediaButton = Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction());  
  28.         if(!isActionMediaButton) return;  
  29.         KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);  
  30.         if(event==nullreturn;  
  31.           
  32.         boolean isActionUp = (event.getAction()==KeyEvent.ACTION_UP);  
  33.         if(!isActionUp) return;  
  34.           
  35.         int keyCode = event.getKeyCode();  
  36.         long eventTime = event.getEventTime()-event.getDownTime();//按键按下到松开的时长  
  37.         Message msg = Message.obtain();  
  38.         msg.what = 100;  
  39.         Bundle data = new Bundle();  
  40.         data.putInt("key_code", keyCode);  
  41.         data.putLong("event_time", eventTime);  
  42.         msg.setData(data);  
  43.         handler.sendMessage(msg);  
  44.           
  45.         //终止广播(不让别的程序收到此广播,免受干扰)  
  46.         abortBroadcast();  
  47.     }  
  48. }  
 

 

(二)在主程序的处理:

 

(1)定义并注册广播服务

Java代码  收藏代码
  1. //初始化Handler对象  
  2. MyHandler handler = new MyHandler();  
  3. //初始化媒体(耳机)广播对象.  
  4. MediaButtonReceiver mediaButtonReceiver = new MediaButtonReceiver(handler);  
  5. //注册媒体(耳机)广播对象  
  6. IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);  
  7. intentFilter.setPriority(100);  
  8. registerReceiver(mediaButtonReceiver, intentFilter);  

 

(2)定义MyHandler和处理广播发回的消息:

Java代码  收藏代码
  1.     private class MyHandler extends Handler{  
  2.     @Override  
  3.     public void handleMessage(Message msg) {  
  4.         int what = msg.what;  
  5.         switch(what){  
  6.         case 100://单击按键广播  
  7.             Bundle data = msg.getData();  
  8.             //按键值  
  9.             int keyCode = data.getInt("key_code");  
  10.             //按键时长  
  11.             long eventTime = data.getLong("event_time");  
  12.             //设置超过2000毫秒,就触发长按事件  
  13.             boolean isLongPress = (eventTime>2000);  
  14.               
  15.             switch(keyCode){  
  16.             case KeyEvent.KEYCODE_HEADSETHOOK://播放或暂停  
  17.             case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE://播放或暂停  
  18.                 playOrPause();  
  19.                 break;  
  20.                   
  21.             //短按=播放下一首音乐,长按=当前音乐快进  
  22.             case KeyEvent.KEYCODE_MEDIA_NEXT:  
  23.                 if(isLongPress){  
  24.                     fastNext(1);//自定义  
  25.                 }else{  
  26.                     playNext();//自定义  
  27.                 }  
  28.                 break;  
  29.                   
  30.             //短按=播放上一首音乐,长按=当前音乐快退    
  31.             case KeyEvent.KEYCODE_MEDIA_PREVIOUS:  
  32.                 if(isLongPress){  
  33.                     fastPrevious(1);//自定义  
  34.                 }else{  
  35.                     playPrevious();//自定义  
  36.                 }  
  37.                 break;  
  38.             }  
  39.               
  40.             break;  
  41.         default://其他消息-则扔回上层处理  
  42.             super.handleMessage(msg);  
  43.         }  
  44.     }  
  45. }  
 

(3)应用程序退出的时候,别忘了取消注册的广播拦截器。

Java代码  收藏代码
  1. unregisterReceiver(mediaButtonReceiver);  
 
阅读更多
个人分类: Android
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭