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); wo newState 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.

InformationsquelleAutor Gordon | 2015-03-01
Schreibe einen Kommentar