我有一个带有单个按钮的耳机,并且在按下按钮时想要做一个简单的Toast。
现在我有以下代码:
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 :(得分:32)
只是想回答我自己的问题,以防其他人遇到类似的问题。
代码确实有效,只是我没有看到Toast,因为我安装了另一个耳机按钮控制器应用程序(并在后台运行),所以我想它优先于我的。但是,当我把
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,一个或另一个可以作为注册意图接收器的方法。
答案 1 :(得分: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调用的情况下工作,但不会很长时间!
答案 2 :(得分:2)
您不应该使用setPriority
您在清单
中注册广播接收器然后使用以下方式注册广播接收器:
AudioManager#registerMediaButtonEventReceiver
registerMediaButtonEventReceiver的参数是指向广播接收器的ComponentName。
答案 3 :(得分:2)
有关Android&gt; 4.0的完整文档答案,请查看此处:
答案 4 :(得分:0)
如果您不想使用BroadcastReceiver,可以使用此处所述的MediaSession为Android&gt; 5.0(API级别21 LOLLIPOP)执行此操作:https://stackoverflow.com/a/39413753/1386969