2011-06-09 63 views
25

我有一個帶有單個按鈕的耳機,並且想在按下按鈕時做一個簡單的Toast。在Android中使用BroadcastReceiver註冊耳機按鈕

現在我有以下代碼:

public class MediaButtonIntentReceiver extends BroadcastReceiver { 

public MediaButtonIntentReceiver() { 
    super(); 
} 

@Override 
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(); 
    if (action == KeyEvent.ACTION_DOWN) { 
    // do something 
     Toast.makeText(context, "BUTTON PRESSED!", Toast.LENGTH_SHORT).show(); 
    } 
    abortBroadcast(); 
} 
} 

而我的主要活動如下:

public class mainActivity extends Activity { 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON); 
    MediaButtonIntentReceiver r = new MediaButtonIntentReceiver(); 
    registerReceiver(r, filter); 

} 
} 

什麼也沒有發生,雖然當我雖然按下按鈕。

我敢肯定,我的權限/ XML在清單中有什麼問題。這裏的接收器XML至今:

<receiver android:name=".MediaButtonIntentReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 
     </intent-filter> 
    </receiver> 

....

和:

<uses-permission android:name="android.permission.BLUETOOTH" /> 

我在logcat中注意到,當我按下按鈕,我從 「BluetoothIntentReceiver」 得到一個錯誤說「onReceive()動作:android.intent.action.MEDIA_BUTTON」

+0

我想改變那個按鈕上的FM廣播電臺,所以我可以這樣做嗎? – 2014-03-11 05:53:20

回答

30

只是想回答我自己的問題,以防其他人遇到類似的問題。

該代碼確實有效,只是我沒有看到吐司,因爲我安裝了另一個耳機按鈕控制器應用程序(並在後臺運行),所以我想它優先於我的。然而,當我把

IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);//"android.intent.action.MEDIA_BUTTON" 
    MediaButtonIntentReceiver r = new MediaButtonIntentReceiver(); 
    filter.setPriority(1000); //this line sets receiver priority 
    registerReceiver(r, filter); 

它能夠與安裝其他應用程序甚至工作。另外,你不需要上面的XML和XML,其中一個或另一個就可以作爲註冊意向接收者的方式。

+1

非常感謝這篇文章。但對我來說,設置優先級1000不起作用,所以我已將其更改爲10,000,然後其作品很好。 – 2011-07-02 08:14:52

+0

我偶然發現了同樣的問題,並將優先級設置爲10,000解決了它。謝謝。 – gnclmorais 2012-01-12 14:36:00

+0

不能在ics設備上工作 – Diljeet 2013-07-04 19:06:21

2

你不應該使用setPriority

您在清單

註冊您的廣播接收器然後,使用註冊您的廣播接收器:

AudioManager#registerMediaButtonEventReceiver

到registerMediaButtonEventReceiver的說法是一個ComponentName指向您的廣播接收器。

+0

你能簡單地解釋一下 – 2016-05-30 09:01:06

5

這裏是我有什麼的工作中的Android 4.2.2

在我的manifest.xml我這樣做:

<receiver android:name=".MediaButtonIntentReceiver"> 
<intent-filter> 
    <action android:name="android.intent.action.MEDIA_BUTTON" /> 
</intent-filter> 

注:這是代替調用registerReceiver的。

在我的主要活動的onCreate我需要調用AudioManager:

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

我發現它沒有AudioManager工作隨叫隨到,但時間不長!

+0

是否需要unRegisterMediaButtonEventReceiver? – 2016-05-05 11:46:20