registerMediaButtonEventReceiver Альтернативный setMediaButtonReceiver (PendingIntent mbr) не работает

При нажатии на гарнитуру необходимо вывести мое приложение на передний план для этого. Я использую метод registerMediaButtonEventReceiver(), он отлично работает для устройств Android ниже 5.1. Теперь этот метод устарел на уровне API 21. Я использую mediasession.setMediaButtonReciever(), чтобы получить высокий приоритет, но он не работает.

AudioManager mAudioManager  = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        ComponentName mediaComponent = new ComponentName(context.getPackageName(), HeadsetReceiver.class.getName());
        mAudioManager.registerMediaButtonEventReceiver(mediaComponent);
        mediaHandler.postDelayed(this, 1000L);

Я публикую это каждую секунду, чтобы получить приоритетное приложение. Я использую этот код в 5.1, но при нажатии кнопки мультимедиа запускается музыка. мое приложение не получает никакого события, чтобы вывести приложение на передний план. Заранее спасибо..

 MediaSession mSession =  new MediaSession(context,context.getPackageName());
        Intent intent = new Intent(context, HeadsetReceiver.class);
        PendingIntent pintent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        mSession.setMediaButtonReceiver(pintent);
        mSession.setActive(true);
        mediaHandler.postDelayed(this, 1000L);

person Gopi Krishna    schedule 26.08.2015    source источник


Ответы (1)


Вы также должны установить PlaybackState следующим образом:

PlaybackState state = new PlaybackState.Builder()
                        .setActions(PlaybackStateCompat.ACTION_FAST_FORWARD | PlaybackStateCompat.ACTION_PAUSE | PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_PLAY_PAUSE | PlaybackStateCompat.ACTION_SKIP_TO_NEXT | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS | PlaybackStateCompat.ACTION_STOP)
                        .setState(PlaybackStateCompat.STATE_PLAYING, 0, 1, SystemClock.elapsedRealtime())
                        .build();
mSession.setPlaybackState(state);
person DSoldo    schedule 09.09.2015
comment
Я видел, что Google Play Music может получать события кнопок гарнитуры и запускать воспроизведение, даже когда приложение полностью остановлено и фоновые службы не запущены. Есть идеи, как это делается? Я спрашиваю здесь, потому что думаю, что этого можно добиться с помощью MediaSession.setMediaButtonReceiver(), но если приложение не запущено, где PlaybackState вступит в игру? - person David Heisnam; 28.08.2016
comment
Лучше всего освобождать сеанс мультимедиа, когда приложение заканчивает воспроизведение или если действие или служба уничтожаются. developer.android.com/reference/android/media/ session/ Я не знаю, как Google Play Music ведет себя в этой ситуации, но я заметил, что GPM, а также музыкальное приложение производителя (например, музыкальное приложение от LG) запускают службу при загрузке. Я думаю, что этот сервис является компонентом, который реагирует на нажатие кнопки мультимедиа. Как проверить, не запущены ли фоновые службы GPM? - person DSoldo; 30.08.2016
comment
Спасибо за ответ. Я убедился, что не запущено ни одного компонента, перейдя в Приложения › Загружено › Google Play Музыка › Force Stop, а затем нажал кнопку гарнитуры. Он снова включился. - person David Heisnam; 31.08.2016
comment
Хорошо, я заметил, что когда вы убиваете приложение с помощью Force Stop, если приложение имеет фоновую службу Android, эта служба автоматически перезапускается системой (я не знаю точного поведения). Я думаю, что у вас такая ситуация: Принудительная остановка GPM › система автоматически перезапускает службу GPM › нажата кнопка › GPM реагирует на кнопку - person DSoldo; 02.09.2016
comment
Я протестировал GPM как на Google Android, так и на Cyanogenmod и обнаружил, что они ведут себя по-разному на этих платформах. Я посмотрю дальше. В любом случае, спасибо за ваши ответы! - person David Heisnam; 03.09.2016