歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 耳機按鈕監聽

Android 耳機按鈕監聽

日期:2017/3/1 10:06:23   编辑:Linux編程

在Android中並沒有定義MediaButtonReceive這個廣播類,MediaButtonReceive只是作為一種通俗的命名方式來響應插入耳機後,點擊耳機上的按鈕(名稱:MEDIA_BUTTON)接受該廣播事件的類。所有該MEDIA_BUTTON的按下我們就簡稱為MEDIA_BUTTON廣播吧。

顧名思義:它顯然是一個廣播接收器類(BroadbcastReceiver),那麼它就具備了BroadbcastReceiver類的使用方式,

但是,因為它需要通過AudioManager對象注冊,所以它有著自己的獨特之處(否則我也不會單獨拿出來分析,- -),後面我們會慢慢的講解。

點擊MEDIA_BUTTON發送的Intent Action 為:

ACTION_MEDIA_BUTTON ="android.intent.action.MEDIA_BUTTON"

Intent 附加值為(Extra)點擊MEDIA_BUTTON的按鍵碼 :

//獲得KeyEvent對象

KeyEvent keyEvent = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);

//獲得Action

String intentAction = intent.getAction() ;

AudioManager對象注冊MEDIA_BUTTON廣播的方法原型為:

public voidregisterMediaButtonEventReceiver(ComponentNameeventReceiver)

Register a component to be the sole receiverof MEDIA_BUTTON intents

Parameters:

eventReceiver : identifier of a BroadcastReceiver that will receive the media button intent. This broadcast receiver

must bedeclared in the application manifest.

從注釋可知以下兩點:

  1. 在AudioManager對象注冊一個MediaoButtonRecevie,使它成為MEDIA_BUTTON的唯一接收器(這很重要,我們會放在後面講解) 也就是說只有我能收到,其他的都收不到這個廣播了,否則的話大家都收到會照成一定的混亂;
  2. 該廣播必須在AndroidManifest.xml文件中進行聲明,否則就監聽不到該MEDIA_BUTTON廣播了。

下面我們就簡單的寫一個MediaButtonReceiver類,並且在AndroidManifest.xml定義

1、 自定義的MediaButtonReceiver 廣播類

  1. package com.qin.mediabutton;
  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.util.Log;
  6. import android.view.KeyEvent;
  7. public class MediaButtonReceiver extends BroadcastReceiver {
  8. private static String TAG = "MediaButtonReceiver";
  9. @Override
  10. public void onReceive(Context context, Intent intent) {
  11. // 獲得Action
  12. String intentAction = intent.getAction();
  13. // 獲得KeyEvent對象
  14. KeyEvent keyEvent = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
  15. Log.i(TAG, "Action ---->" + intentAction + " KeyEvent----->"+ keyEvent.toString());
  16. if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
  17. // 獲得按鍵字節碼
  18. int keyCode = keyEvent.getKeyCode();
  19. // 按下 / 松開 按鈕
  20. int keyAction = keyEvent.getAction();
  21. // 獲得事件的時間
  22. long downtime = keyEvent.getEventTime();
  23. // 獲取按鍵碼 keyCode
  24. StringBuilder sb = new StringBuilder();
  25. // 這些都是可能的按鍵碼 , 打印出來用戶按下的鍵
  26. if (KeyEvent.KEYCODE_MEDIA_NEXT == keyCode) {
  27. sb.append("KEYCODE_MEDIA_NEXT");
  28. }
  29. // 說明:當我們按下MEDIA_BUTTON中間按鈕時,實際出發的是 KEYCODE_HEADSETHOOK 而不是
  30. // KEYCODE_MEDIA_PLAY_PAUSE
  31. if (KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE == keyCode) {
  32. sb.append("KEYCODE_MEDIA_PLAY_PAUSE");
  33. }
  34. if (KeyEvent.KEYCODE_HEADSETHOOK == keyCode) {
  35. sb.append("KEYCODE_HEADSETHOOK");
  36. }
  37. if (KeyEvent.KEYCODE_MEDIA_PREVIOUS == keyCode) {
  38. sb.append("KEYCODE_MEDIA_PREVIOUS");
  39. }
  40. if (KeyEvent.KEYCODE_MEDIA_STOP == keyCode) {
  41. sb.append("KEYCODE_MEDIA_STOP");
  42. }
  43. // 輸出點擊的按鍵碼
  44. Log.i(TAG, sb.toString());
  45. }
  46. }
  47. }

2、在AndroidManifest.xml聲明我們定義的廣播類。

  1. <receiver android:name="MediaButtonReceiver">
  2. <intent-filter >
  3. <action android:name="android.intent.action.MEDIA_BUTTON"></action>
  4. </intent-filter>
  5. </receiver>

在模擬器上,我們可以手動構造MEDA_BUTTON的廣播,並且將它發送出去(後面會介紹)。

如果有真機測試的話,按下MEDIA_BUTTON是可以接受到MEDIA_BUTTON廣播的,如果沒有接受到,請關閉所有應用程序,在觀察效果。

Copyright © Linux教程網 All Rights Reserved