`
linuxstuding
  • 浏览: 1232059 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

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

Java代码收藏代码
  1. importandroid.content.BroadcastReceiver;
  2. importandroid.content.Context;
  3. importandroid.content.Intent;
  4. importandroid.os.Bundle;
  5. importandroid.os.Handler;
  6. importandroid.os.Message;
  7. importandroid.util.Log;
  8. importandroid.view.KeyEvent;
  9. publicclassMediaButtonReceiverextendsBroadcastReceiver{
  10. /**
  11. *Handler
  12. */
  13. privateHandlerhandler;
  14. /**
  15. *构造器.
  16. *@paramhandler
  17. */
  18. publicMediaButtonReceiver(Handlerhandler){
  19. this.handler=handler;
  20. }
  21. @Override
  22. publicvoidonReceive(Contextcontext,Intentintent){
  23. booleanisActionMediaButton=Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction());
  24. if(!isActionMediaButton)return;
  25. KeyEventevent=(KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
  26. if(event==null)return;
  27. booleanisActionUp=(event.getAction()==KeyEvent.ACTION_UP);
  28. if(!isActionUp)return;
  29. intkeyCode=event.getKeyCode();
  30. longeventTime=event.getEventTime()-event.getDownTime();//按键按下到松开的时长
  31. Messagemsg=Message.obtain();
  32. msg.what=100;
  33. Bundledata=newBundle();
  34. data.putInt("key_code",keyCode);
  35. data.putLong("event_time",eventTime);
  36. msg.setData(data);
  37. handler.sendMessage(msg);
  38. //终止广播(不让别的程序收到此广播,免受干扰)
  39. abortBroadcast();
  40. }
  41. }

(二)在主程序的处理:

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

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

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

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

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

Java代码收藏代码
  1. unregisterReceiver(mediaButtonReceiver);
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics