2013-12-21 64 views
2

我正在開發耳機按鈕控制器,並使用廣播接收器來檢測耳機按鈕按壓。如何檢測耳機按鈕雙擊HTC手機與廣播接收器?

((AudioManager) getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(getPackageName(), MediaButtonIntentReceiver.class.getName())); 

onReceive方法:

public void onReceive(Context context, Intent intent) { 
    String intentAction = intent.getAction(); 
    if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { 
     return; 
    } 
    KeyEvent event = (KeyEvent) intent 
      .getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
    if (event == null) { 
     return; 
    } 
    int action = event.getAction(); 

    switch (event.getKeyCode()) { 
    case KeyEvent.KEYCODE_HEADSETHOOK: 
     if (action == KeyEvent.ACTION_DOWN) { 
      long time = SystemClock.uptimeMillis(); 
      // double click 
      if (time - sLastClickTime < DOUBLE_CLICK_DELAY) 
       // do something 
       Toast.makeText(context, "BUTTON PRESSED DOUBLE!", 
         Toast.LENGTH_SHORT).show(); 
      // single click 
      else { 
       // do something 
       Toast.makeText(context, "BUTTON PRESSED!", 
         Toast.LENGTH_SHORT).show(); 
      } 
      sLastClickTime = time; 
     } 
     break; 
    } 
    abortBroadcast(); 

} 

,它工作正常。 問題是在HTC Android手機它不能收到雙擊。雙擊耳機按鈕時,默認情況下會撥打您的最後一個電話,並且我無法在我的應用程序中檢測到雙擊。 有什麼辦法可以禁用android API的這個動作嗎?

我試着將我的廣播接收機的優先級設置爲一個很大的數字,但它沒有工作。 即使我試圖在電話的通話記錄中放置假/無效呼叫,但我無法做到這一點。 任何想法我該如何解決這個問題?

+0

您是否在HTC或第一個單擊中獲得了點擊? –

+0

@Babibu不只是第一個 – Mehrdad

回答

2

解決方案非常簡單。在清單文件中設置優先級爲最大整數(2147483647)而不是Google(1000)定義的最大值,解決了問題,並且電話不會通過雙擊撥號最後一個號碼,並且廣播接收器檢測到耳機按鈕雙擊。

<receiver 
     android:name=".MediaButtonIntentReceiver" 
     android:enabled="true" > 
     <intent-filter android:priority="2147483647"> 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 
     </intent-filter> 
</receiver> 
0

您的解決方案並不適用於我也不是最佳實踐。

對於其他誰有同樣的問題。這是我在音樂播放器中用來處理耳機控制的單擊和雙擊。這應該適用於所有耳機。

static final long CLICK_DELAY = 500; 
static long lastClick = 0; // oldValue 
static long currentClick = System.currentTimeMillis(); 

@Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_MEDIA_BUTTON)) { 

      KeyEvent keyEvent = (KeyEvent) intent.getExtras().get(Intent.EXTRA_KEY_EVENT); 

      if (keyEvent.getAction() != KeyEvent.ACTION_DOWN)return; 

      lastClick = currentClick ; 

      currentClick = System.currentTimeMillis(); 

      if(currentClick - lastClick < CLICK_DELAY){ 

       //This is double click 

      } else { 

       //This is single click 

      } 
     }