MTK Android 耳機線控的實現方法


android 耳機線控的實現方法

keycodeonkeydownkeyevent
耳機線控的功能
耳機線控是一種很好用,並且能提升用戶體驗的功能。可以用來實現一些常用和基本的功能。比如:實現音樂播放的控制,接聽電話,音量控制等。下面寫一下耳機線控的幾種實現方式。

耳機線控的實現
耳機線控實現方式主要有兩種,(注:可能出現無法獲取鍵值的問題,可能導致的原因是: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); 


};
//注:這種方法處理長按之前一定會先執行短按。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM