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);  
         }  
     }  
}; 
//注:這種方法處理長按之前一定會先執行短按。 
發佈了35 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章