在Android中使用BroadcastReceiver注册耳机button

我有一个单一的button,并希望做一个简单的吐司当button按下的耳机。

现在我有以下代码:

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); } } 

虽然当我按下button但没有发生。

我敢肯定,我的权限/ 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中,当我按下button时,我从“BluetoothIntentReceiver”说“onReceive()行动:android.intent.action.MEDIA_BUTTON”

只是想回答我自己的问题,以防其他人遇到类似的问题。

代码工作,只是我没有看到吐司,因为我有另一个耳机button控制器应用程序安装(并在后台运行),所以我想它优先于我的。 但是,当我把

  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,其中一个或者另一个就可以用来注册intent接收方。

这是我在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调用的情况下工作,但不会很长!

你不应该使用setPriority

您在清单中注册您的广播接收机

然后使用以下方法注册您的广播接收机

AudioManager#registerMediaButtonEventReceiver

registerMediaButtonEventReceiver的参数是指向您的广播接收器的ComponentName。

对于Android 4.0的完整logging答案看看这里:

BroadcastReceiver ACTION_MEDIA_BUTTON无法正常工作

如果您不想使用BroadcastReceiver,则可以使用以下介绍的MediaSession为Android> 5.0(API级别21 LOLLIPOP)执行此操作: https : //stackoverflow.com/a/39413753/1386969