Wie die neue MediaSession Klasse zu erhalten media-Taste drückt, auf Android 5.x?
Versuche ich zu erhalten die media-Taste drückt, mit der neuen MediaSession Klasse und ich habe bisher erfolglos gewesen. Hat jemand geschafft, Sie zu empfangen mit der neuen Klasse?
Habe ich schon erfolgreich bei der Schaffung einer MediaSession und es zu benutzen, zu aktualisieren song-Informationen auf einem remote-display (in-car-entertainment-system), aber bisher bin ich nicht in der Lage zu empfangen Knopf drückt aus, Kopfhörer-Steuerelemente und Steuerelemente, die auf Bluetooth-headsets.
Nachdem ich das media-session bin ich zum ausführen der folgenden, die in einen Dienst, den ich verwenden, um zu spielen audio:
_mediaSession = new MediaSession(getApplicationContext(), Global.PACKAGE_NAME + "." + TAG);
if (_mediaSession == null) {
_log.e(TAG, "initMediaSession: _mediaSession = null");
return;
}
_mediaSessionToken = _mediaSession.getSessionToken();
_mediaSession.setCallback(new Callback() {
public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
_log.d(TAG, "onMediaButtonEvent called: " + mediaButtonIntent);
return false;
}
public void onPause() {
Log.d(TAG, "onPause called (media button pressed)");
super.onPause();
}
public void onPlay() {
Log.d(TAG, "onPlay called (media button pressed)");
super.onPlay();
}
public void onStop() {
Log.d(TAG, "onStop called (media button pressed)");
super.onStop();
}
});
_mediaSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);
PlaybackState state = new PlaybackState.Builder()
.setActions(PlaybackState.ACTION_PLAY)
.setState(PlaybackState.STATE_STOPPED, PlaybackState.PLAYBACK_POSITION_UNKNOWN, SystemClock.elapsedRealtime())
.build();
_mediaSession.setPlaybackState(state);
_mediaSession.setActive(true);
aber ich bin immer noch nicht erhalten, keine Taste drückt.
Jemand irgendwelche Ideen?
Dank
Update Nach dem Wechsel
PlaybackState state = new PlaybackState.Builder()
.setActions(PlaybackState.ACTION_PLAY)
.setState(PlaybackState.STATE_STOPPED, PlaybackState.PLAYBACK_POSITION_UNKNOWN, SystemClock.elapsedRealtime())
.build();
zu
PlaybackState state = new PlaybackState.Builder()
.setActions(PlaybackState.ACTION_PLAY)
.setState(PlaybackState.STATE_STOPPED, PlaybackState.PLAYBACK_POSITION_UNKNOWN, 0)
.build();
Ich bin jetzt empfangen-Taste drücken Sie die Meldungen über die onMediaButtonEvent() callback (wie Sie benachrichtigt werden, dass KEYCODE_MEDIA_PAUSE gedrückt wurde), aber onPlay(), onPause () und onStop() werden nie genannt, keine Ahnung warum?
- Ich weiß nicht, ob das funktioniert für Sie, aber Sie könnten versuchen, hinzufügen von mehr unterstützten Aktionen der
PlaybackState
Instanz, so ersetzen:.setActions(PlaybackState.ACTION_PLAY)
mit:.setActions(PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PLAY_PAUSE | PlaybackState.ACTION_PAUSE );
- Danke für die Idee, ich habe es ausprobiert und leider hinzufügen zusätzliche Aktionen hatten keine Wirkung.
- kannst du mehr code..das gibt uns die Idee, beim erstellen der media-Sitzung und, wenn Sie initialisieren
- Der Letzte parameter in der
.setState(...)
nennen sollte, werden die Wiedergabe-Geschwindigkeit, ich benutze 1 alle die Zeit, und es funktioniert für mich. In meinem code habe ich.setState(newState, 0, 1);
wonewState
ist eine ganze Zahl, berechnet als angemessen. - Danke, ich ändern Sie die Wiedergabegeschwindigkeit um 1. Ich bin jetzt empfangen-button drücken-Benachrichtigungen, sondern nur über die onMediaButtonEvent() callback, für einige Grund, onPlay(), onPause(), onStop() wird nie aufgerufen wird, auch wenn onMediaButtonEvent() aufgerufen, mit KEYCODE_MEDIA_PAUSE.
- Ich zusätzlichen code, dass ich die Ausführung vor dem Aufruf von setCallback() erstellt der media-Sitzung. Der obige code aufgerufen wird, nachdem mein Spieler-Dienst gestartet wird (es ist die Aufgabe spielen Sie audio für die app). In der Realität ist der code, nachdem die Aufrufe an setFlags() nicht aufgerufen werden, hier (in meiner Initialisierungs-Funktion), sondern werden stattdessen aufgerufen, die anderswo in den Dienst.
- Ich denke, dass eigentlich passiert mir das auch, aber in meiner Implementierung habe ich nicht verwenden, die callback-sowieso (ich verlasse mich auf die key-codes nur, weil Sie berichtet von den hardware-Tasten am headset auch) und ich habe keine Ahnung, warum.
Du musst angemeldet sein, um einen Kommentar abzugeben.
onMediaButtonEvent(..)
hat eine default-Implementierung in MediaSession.Callback. In Ihrem code, wenn Sie anrufen super.onMediaButtonEvent(..), dann je nach Tastencode-die richtige callback-nämlichonPlay()
,onPause()
aufgerufen werden.Können Sie einen Blick auf die default-Implementierung in MediaSession.java
Die default-Implementierung von onMediaButtonEvent ist, was die zahlen, die spezifische callback für einen gegebenen Medien-Schlüssel-Ereignis. Da bist du überschreiben onMediaButtonEvent und ruft nicht die super Umsetzung, erhalten Sie nur onPlay/Pause/usw. Anrufe aus anderen apps die Verwendung einer MediaController, um diese Anrufe direkt.
Wenn Sie hinzufügen, ändern Sie Ihre Implementierung zu
Sollten Sie beginnen, sehen Sie die Tasten übersetzt die anderen callback-Methoden.