2012-01-29 106 views
13

我研究了ACTION_MEDIA_BUTTON的意圖,並試圖使用它,並攔截按鈕並使用吐司在屏幕上顯示它們。我註冊了接收器攔截兩個目的:如何攔截Android中耳機上的按鈕?

  1. ACTION_HEADSET_PLUG - 插上耳機

  2. ACTION_MEDIA_BUTTON - 如果接收到按鈕按下

這是我的主要活動進行:

 IntentFilter mediaFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON); 
     mediaFilter.setPriority(10000); 
     registerReceiver(_receiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG)); 
     registerReceiver(_receiver, mediaFilter); 

這是r的部分eceiver處理該按鈕按下:

if (action.equals(Intent.ACTION_HEADSET_PLUG)) 
    { 
     Toast.makeText(context, "earphones activity",Toast.LENGTH_SHORT).show(); 
     if (intent.getExtras().getInt("state")==1)//if plugged 
      Toast.makeText(context, "earphones plugged",Toast.LENGTH_LONG).show(); 
     else Toast.makeText(context, "earphones un-plugged",Toast.LENGTH_LONG).show(); 
    } 
    else 
    if (action.equals(Intent.ACTION_MEDIA_BUTTON)) 
    { 
     Toast.makeText(context, "button pressed",Toast.LENGTH_LONG).show(); 
     key=intent.getExtras().getString("EXTRA_KEY_EVENT"); 
     Toast.makeText(context, key,Toast.LENGTH_LONG).show(); 
    } 

現在處理耳機插件和拆除工作正常,但攔截按按鍵部分不是一部分。

是否有任何理由處理ACTION_MEDIA_BUTTON不起作用的代碼?

是否有我需要攔截這種意圖的特殊許可?

我正在使用三星Galaxy S2來測試代碼。

我看過所有類似的帖子,並試過一切。不幸的是似乎沒有任何工作

+0

你在測試什麼設備? – slayton 2012-01-29 21:12:21

+0

samsung galaxy s 2 – 2012-01-29 21:26:23

+0

我不確定,但它可能是TouchWiz沒有正確實現ANDROID_MEDIA_BUTTON意圖... – slayton 2012-01-29 21:30:50

回答

3

我最近開發了迴應媒體按鈕的應用程序。我在三星Galaxy S II中測試過它,它工作正常。

首先,在你AndroidManifest.xml,該<application>區域內,放置以下:

<!-- Broadcast Receivers --> 
<receiver android:name="net.work.box.controller.receivers.RemoteControlReceiver" > 
    <intent-filter android:priority="1000000000000000" > 
     <action android:name="android.intent.action.MEDIA_BUTTON" /> 
    </intent-filter> 
</receiver> 

然後,在不同的文件中創建一個BroadcastReceiver

public class RemoteControlReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction()) { 
      KeyEvent event = (KeyEvent) intent .getParcelableExtra(Intent.EXTRA_KEY_EVENT); 

      if (event == null) { 
       return; 
      } 

      if (event.getAction() == KeyEvent.ACTION_DOWN) { 
       context.sendBroadcast(new Intent(Intents.ACTION_PLAYER_PAUSE)); 
      } 
     } 
    } 

} 

這可能是的最好的解決方案在那裏(特別是上面的硬編碼android:priority)。然而,它嘗試了其他一些技術,但他們都沒有工作。所以我不得不訴諸於此......我希望我能幫上忙。

+2

請檢查以下鏈接。簡單而容易。 http://android-developers.blogspot.com/2010/06/allowing-applications-to-play-nicer.html – Milton 2013-08-03 13:41:25

+1

這對我有用! – Prachi 2014-05-13 07:42:25

+0

PS:1000必須是較高的優先值,如果您使用android:priority =「1000000000000000」,則應該得到一個警告或錯誤指出。正確的事情是:經過幾天的鬥爭, leoneboaventura 2016-03-12 03:29:14

0
if (Intent.ACTION_MEDIA_BUTTON.equals(action)) { 
    if (intent.hasExtra(Intent.EXTRA_KEY_EVENT)) { 
     String key = intent.getStringExtra(Intent.EXTRA_KEY_EVENT); 
     toast("Button "+key+" was pressed"); 
    } else 
     toast("Some button was pressed"); 
} 

此代碼返回吐司「按鈕無效按下」

+0

如果您遇到問題,請發表評論而不是提供答案。 – Mercurial 2014-02-26 10:24:44

2

感謝貢獻。

對於所有其他掙扎這裏是最終結論:

經過大量的血淚我終於認識到,有兩種類型的廣播,我可以攔截:有的像ACTION_HEADSET_PLUG需要在登記活動代碼。需要

有些人則喜歡ACTION_MEDIA_BUTTON在清單文件進行註冊。

在這個例子中,爲了攔截這兩種意圖,我們需要兩者都做。

將其設置在代碼和清單文件中。

+0

:非常感謝你! – elgui 2012-12-03 15:58:08