2011-06-09 64 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