在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