Регистрация нажатия кнопки гарнитуры с помощью BroadcastReceiver в Android
У меня есть гарнитура с одной кнопкой, и я хочу сделать простой тост, когда кнопка нажата.
Прямо сейчас у меня есть следующий код:
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);
}
}
Ничего не происходит, хотя, когда я нажимаю кнопку, хотя.
Я почти уверен, что что-то не так с моими permissions/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() Action: android.intent.action.MEDIA_BUTTON"
5 ответов
Просто хотел ответить на мой собственный вопрос на случай, если другие столкнутся с подобными проблемами.
Код работает, просто я не видел 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, один или другой отлично подходит для регистрации намеренного получателя.
Вот что у меня работает в Android 4.2.2
В моем manifest.xml я делаю это:
<receiver android:name=".MediaButtonIntentReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
NB: это вместо звонка registerReceiver
,
В моей основной деятельности onCreate
Мне нужно вызвать AudioManager:
((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(
new ComponentName(
getPackageName(),
MediaButtonIntentReceiever.class.getName()));
Я обнаружил, что он будет работать без вызова AudioManager, но ненадолго!
Вы не должны использовать setPriority
Вы регистрируете свой вещательный приемник в манифесте
Затем вы регистрируете свой приемник вещания, используя:
AudioManager # registerMediaButtonEventReceiver
Аргумент для registerMediaButtonEventReceiver - это ComponentName, который указывает ваш широковещательный получатель.
Полностью документированный ответ для Android >4.0 смотрите здесь:
Если вы не хотите использовать BroadcastReceiver, вы можете сделать это для Android >5.0 (уровень API 21 LOLLIPOP), используя MediaSession, описанный здесь: /questions/31808555/kak-proslushat-sobyitie-actiondown-nazhatie-klavishi-v-android-onmediabuttonevent-chtobyi-izmerit-vremya/31808558#31808558