Ich habe versucht, die Steuerung der Media-Tasten nach Google's Talk
zu implementierenIch habe den Empfänger in Manifest gesetzt:
%Vor% Erstellen Sie die MediaSessionCompat
in onCreate()
des Dienstes:
und handle mit der Absicht in onStartCommand()
Ich rufe dann setActive(true);
an, wenn ich den Audiofokus erreiche, und setActive(false);
, wenn ich die Wiedergabe stoppe. Das funktioniert das erste Mal, meine App wird zum bevorzugten Media-Button-Empfänger und erhält Rückrufe.
Wenn ich jedoch die Wiedergabe in meiner App stoppe, gehe in eine andere App wie Google Play Musik und starte dort die Wiedergabe, dann gehe zu meiner App und rufe setActive(true)
Google Play Music erhält weiterhin den Rückruf und die Media-Buttons don ' t arbeiten in meiner App.
Nach meinem Verständnis sollte der letzte Aufruf von setActive(true)
Vorrang haben. Ich habe überprüft, dass isActive()
wahr zurückgibt. Ich kann das Problem auch umgehen, indem ich jedes Mal ein neues MediaSessionCompat
erstelle, aber das scheint nicht ideal zu sein.
Wie kann ich erreichen, dass meine App bei jedem Aufruf von setActive(true)
zum bevorzugten Media-Button-Empfänger wird?
UPDATE: Minimales Projekt, um das Problem hier zu reproduzieren: Ссылка
Schritte zum Reproduzieren:
setActive(true)
wird aufgerufen und
MediaButtonReceiver ist jetzt die bevorzugte Medienschaltfläche. setActive(true)
auf
nochmal. Die andere App reagiert immer auf Medientasten. Dies wurde auf Android 6.0 getestet.
Der Schlüssel dafür, dass dies richtig funktioniert, ist die korrekte Einstellung von PlaybackState
bei jedem Start oder Anhalten der App (was geschehen sollte, wenn eine andere Anwendung die Audiositzung erhält und ihre eigene MediaSession
aktiviert.) Das Problem tritt wie oben auf. Außerdem muss für Android 4.4 und niedriger FLAG_HANDLES_TRANSPORT_CONTROLS
gesetzt sein oder das gleiche Problem wird auftreten.
Meine Beobachtungen: (Nicht genug Reputation, um Kommentare abzugeben, Entschuldigung, aber ich kann auf die Kommentare für diese Antwort antworten)
'App ausführen, drücken Sie die PLAY-Taste. setActive (true) wird aufgerufen und MediaButtonReceiver ist jetzt die bevorzugte Medienschaltfläche ': weil Android zuerst Medienschaltflächenereignisse an die Vordergrundaktivität sendet.
'Starten Sie die Wiedergabe auf einer anderen App ....... Drücken Sie auf dieser App die Pause ......... dann kehren Sie zu meiner App zurück und rufen Sie setActive (true)':
a) Wenn Sie vor dem Abspielen von GooglePlay Music onStop-Listener aufgerufen haben, ist Ihre Mediensitzung nicht aktiv (bis onPlay erneut aufgerufen wird), wenn Sie eine beliebige Medienschaltfläche drücken, sodass die aktuelle Sitzung von Google Play wiedergegeben wird / p>
b) Wenn Sie onStop nicht aufgerufen haben, gibt es zwei aktive Sitzungen (die erste Sitzung Ihrer App und die erste Sitzung von Google Play. Die zweite Sitzung wird nicht aufgerufen, es sei denn, OnPlay wird erneut aufgerufen). Laut der Dokumentation versucht Android bei mehreren aktiven Mediensitzungen, eine Mediensitzung auszuwählen, die sich auf die Wiedergabe (Puffern / Verbinden), Abspielen oder Pausieren vorbereitet und nicht auf eine angehaltene Mediensitzung. Also ist GooglePlay die letzte aktive Sitzung mit angehaltenem Status und wird gespielt.
c) Wenn Sie onStop aufgerufen hätten (also setActive (false)) und GooglePlayMusic auch Active (false) gesetzt hat und Sie nicht erneut auf Play geklickt haben, wird GooglePlayMusic auch in diesem Fall abgespielt Bei einer aktiven Sitzung versucht Android, das Ereignis an die zuletzt aktive Sitzung zu senden. Auf Android 5.0 (API-Stufe 21) oder höher wird das Ereignis nur an Sitzungen gesendet, die setMediaButtonReceiver () aufgerufen haben. "
Haben Sie MediaButtonReceiver () gesetzt?
Ссылка Bitte schauen Sie es sich an
Tags und Links android android-mediasession