Не удалось поймать android.intent.action.MEDIA_BUTTON
Мое приложение, которое использует TextToSpeech для чтения некоторого текста, завершено на 90%, но застряло на этой части на несколько дней. Все, что я хочу, это иметь кнопку воспроизведения / паузы на моей гарнитуре Bluetooth (наушники Xiaomi Mi Sports Bluetooth) для воспроизведения / паузы TextToSpeech. Я думаю, что мне нужно поймать android.intent.action.MEDIA_BUTTON, поэтому я добавил это:
В AndroidManifest.xml:
<receiver android:name=".ButtonReceiver">
<intent-filter
android:priority="10000">
<action android:name="android.intent.action.MEDIA_BUTTON"/>
</intent-filter>
</receiver>
Затем класс ButtonReceiver.java
public class ButtonReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "debug media button test", Toast.LENGTH_LONG).show();
// will finish the code once I catch this intent
}
}
Текст отладки не отображается. Хотя, если бы я изменил
<action android:name="android.intent.action.MEDIA_BUTTON"/>
к
<action android:name="android.media.VOLUME_CHANGED_ACTION"/>
, он показывает текст, когда я нажимаю кнопку увеличения или уменьшения громкости гарнитуры, но это не совсем то, что мне нужно. Я хочу, чтобы приложение реагировало только на кнопку воспроизведения/паузы.
Затем я прочитал, что мне нужно использовать , поэтому я попытался добавить это в свой MainActivity.java:
private AudioManager audioManager;
private ComponentName componentName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
audioManager = (AudioManager) this.getSystemService(AUDIO_SERVICE);
componentName = new ComponentName(this, ButtonReceiver.class);
audioManager.registerMediaButtonEventReceiver(componentName);
}
До сих пор не работает. Также в нем говорится о
registerMediaButtonEventReceiver
устарел, поэтому мне интересно, является ли это причиной того, что он не работает.
Дальнейшее чтение со страницы официального документа говорит следующее:
Если вы используете Android 5.0 (уровень API 21) или более позднюю версию, вызовите FLAG_HANDLES_MEDIA_BUTTONSMediaBrowserCompat.ConnectionCallback.onConnected. Это автоматически вызовет функцию dispatchMediaButtonEvent() вашего медиа-контроллера, которая переводит код клавиши в обратный вызов медиа-сеанса.
Я нахожу это глупым, так как мне не нужен этот дополнительный модуль для воспроизведения мультимедиа. Все, что мне нужно, это обнаружение нажатия кнопки гарнитуры. В любом случае, я попытался внедрить MediaSession, но вскоре сдался, так как быстро получил слишком много кодов, которые были бесполезны для моего приложения, поскольку мое приложение НЕ является приложением для аудиоплеера!
Любое предложение? Что я должен делать?
1 ответ
Наконец-то я нашел решение сам! Вместо создания отдельного класса BroadcastReceiver я добавил общедоступный статический класс в свой MainActivity.java:
public static class ButtonReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
Toast.makeText(context, "debug media button test", Toast.LENGTH_SHORT).show();
...
}
}
Затем добавил эту строку в onCreate:
((AudioManager)getSystemService(AUDIO_SERVICE))
.registerMediaButtonEventReceiver(new ComponentName(this, ButtonReceiver.class));
И, наконец, в AndroidManifest.xml:
<receiver android:name=".MainActivity$ButtonReceiver"
android:enabled="true">
<intent-filter
android:priority="10000">
<action android:name="android.intent.action.MEDIA_BUTTON"/>
</intent-filter>
</receiver>
Оно работает! Приложение теперь может перехватывать намерение MEDIA_BUTTON с этой настройкой!