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