Не удалось поймать 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 с этой настройкой!

Другие вопросы по тегам