使用线控耳机来操控应用功能
实现原理:通过广播拦截来实现。
(一)定义1个广播拦截器,用来拦截线控耳机按键产生的广播事件。
- importandroid.content.BroadcastReceiver;
- importandroid.content.Context;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.os.Handler;
- importandroid.os.Message;
- importandroid.util.Log;
- importandroid.view.KeyEvent;
- publicclassMediaButtonReceiverextendsBroadcastReceiver{
- /**
- *Handler
- */
- privateHandlerhandler;
- /**
- *构造器.
- *@paramhandler
- */
- publicMediaButtonReceiver(Handlerhandler){
- this.handler=handler;
- }
- @Override
- publicvoidonReceive(Contextcontext,Intentintent){
- booleanisActionMediaButton=Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction());
- if(!isActionMediaButton)return;
- KeyEventevent=(KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
- if(event==null)return;
- booleanisActionUp=(event.getAction()==KeyEvent.ACTION_UP);
- if(!isActionUp)return;
- intkeyCode=event.getKeyCode();
- longeventTime=event.getEventTime()-event.getDownTime();//按键按下到松开的时长
- Messagemsg=Message.obtain();
- msg.what=100;
- Bundledata=newBundle();
- data.putInt("key_code",keyCode);
- data.putLong("event_time",eventTime);
- msg.setData(data);
- handler.sendMessage(msg);
- //终止广播(不让别的程序收到此广播,免受干扰)
- abortBroadcast();
- }
- }
(二)在主程序的处理:
(1)定义并注册广播服务
- //初始化Handler对象
- MyHandlerhandler=newMyHandler();
- //初始化媒体(耳机)广播对象.
- MediaButtonReceivermediaButtonReceiver=newMediaButtonReceiver(handler);
- //注册媒体(耳机)广播对象
- IntentFilterintentFilter=newIntentFilter(Intent.ACTION_MEDIA_BUTTON);
- intentFilter.setPriority(100);
- registerReceiver(mediaButtonReceiver,intentFilter);
(2)定义MyHandler和处理广播发回的消息:
- privateclassMyHandlerextendsHandler{
- @Override
- publicvoidhandleMessage(Messagemsg){
- intwhat=msg.what;
- switch(what){
- case100://单击按键广播
- Bundledata=msg.getData();
- //按键值
- intkeyCode=data.getInt("key_code");
- //按键时长
- longeventTime=data.getLong("event_time");
- //设置超过2000毫秒,就触发长按事件
- booleanisLongPress=(eventTime>2000);
- switch(keyCode){
- caseKeyEvent.KEYCODE_HEADSETHOOK://播放或暂停
- caseKeyEvent.KEYCODE_MEDIA_PLAY_PAUSE://播放或暂停
- playOrPause();
- break;
- //短按=播放下一首音乐,长按=当前音乐快进
- caseKeyEvent.KEYCODE_MEDIA_NEXT:
- if(isLongPress){
- fastNext(1);//自定义
- }else{
- playNext();//自定义
- }
- break;
- //短按=播放上一首音乐,长按=当前音乐快退
- caseKeyEvent.KEYCODE_MEDIA_PREVIOUS:
- if(isLongPress){
- fastPrevious(1);//自定义
- }else{
- playPrevious();//自定义
- }
- break;
- }
- break;
- default://其他消息-则扔回上层处理
- super.handleMessage(msg);
- }
- }
- }
(3)应用程序退出的时候,别忘了取消注册的广播拦截器。
- unregisterReceiver(mediaButtonReceiver);