Mediensitzung verwenden

Mediensitzungen bieten eine universelle Möglichkeit, mit einem Audio oder Video zu interagieren. Player. Durch die Information von Android, dass Medien in einer App abgespielt werden, wird die Wiedergabe können an die App delegiert werden. Durch die Einbindung in die Mediensitzung eine App, um die Medienwiedergabe extern zu bewerben und Wiedergabebefehle zu erhalten aus externen Quellen. Bei diesen Quellen kann es sich um physische Schaltflächen wie die Wiedergabeschaltfläche auf einem Headset oder einer TV-Fernbedienung) oder indirekte Befehle (z. B. „Pause“ anweisen, Google Assistant). In der Mediensitzung werden diese an die App, die sie auf den Mediaplayer anwendet, für den sie verwendet werden. transparent den Ursprung der Befehle.

Neben dem von ihm verwalteten Player befindet sich eine Mediensitzung. Sie sollten und initialisieren Sie in der onCreate()-Methode der Aktivität oder dem die Mediensitzung und der zugehörige Player gehören.

Mediensitzung initialisieren

Eine neu erstellte Mediensitzung hat keine Funktionen. Sie müssen die Sitzung initialisieren, indem Sie die folgenden Schritte ausführen:

  • Legen Sie Flags fest, damit die Mediensitzung Callbacks von Mediencontrollern und Medienschaltflächen empfangen kann.
  • Erstellen und initialisieren Sie eine Instanz von PlaybackStateCompat und weisen Sie sie der Sitzung zu. Der Wiedergabestatus ändert sich während der Sitzung. Daher empfehlen wir, die PlaybackStateCompat.Builder zur Wiederverwendung im Cache zu speichern.
  • Erstellen Sie eine Instanz von MediaSessionCompat.Callback und weisen Sie sie der Sitzung zu. Weitere Informationen zu Callbacks finden Sie weiter unten.

Erstellen und initialisieren Sie eine Mediensitzung in der onCreate()-Methode des Aktivität oder Dienst, dem die Sitzung gehört.

Damit Medienschaltflächen funktionieren Wenn deine App neu initialisiert (oder beendet) wird, muss ihr PlaybackState eine Wiedergabeaktion enthalten, die dem Intent entspricht, den die Medienschaltfläche sendet. Dies ist warum ACTION_PLAY während dieser Zeit dem Sitzungsstatus zugewiesen wird die Initialisierung bei. Weitere Informationen finden Sie unter Auf Medien antworten Schaltflächen:

Wiedergabestatus und Metadaten beibehalten

Es gibt zwei Klassen, die den Status einer Mediensitzung darstellen.

Die PlaybackStateCompat -Klasse den aktuellen Betriebsstatus des Players beschreibt. Sie beinhalten die folgenden Funktionen:

  • Der Transportstatus (z. B. ob der Player eine Wiedergabe/pausiert/zwischenspeichert usw.)getState()
  • Ein Fehlercode und eine optionale Fehlermeldung (falls zutreffend). Weitere Informationen finden Sie unter getErrorCode() und unten im Abschnitt Zustände und Fehler.
  • Playerposition
  • Die gültigen Controlleraktionen, die im aktuellen Status verarbeitet werden können

Das MediaMetadataCompat -Klasse beschreibt das Material, das wiedergegeben wird:

  • Name des Künstlers, des Albums und des Titels
  • Titeldauer
  • Albumcover zur Anzeige auf dem Sperrbildschirm. Das Bild ist eine Bitmap mit einer maximalen Größe von 320 x 320 dp. Wird das Bild größer, wird es verkleinert.
  • Eine Instanz von ContentUris, die auf eine größere Version des Artworks verweist

Der Player-Status und die Metadaten können sich im Laufe der Zeit einer Mediensitzung ändern. Jedes Mal, wenn sich der Status oder die Metadaten ändern, müssen Sie den entsprechenden Builder für jede Klasse (PlaybackStateCompat.Builder() oder MediaMetadataCompat.Builder()) verwenden und dann die neue Instanz durch folgenden Aufruf an die Mediensitzung übergeben: setPlaybackState() oder setMetaData(). Um den Gesamtarbeitsspeicherverbrauch aus diesen häufigen Vorgängen zu reduzieren, empfiehlt es sich, die Builder einmal zu erstellen und sie während der Lebensdauer der Sitzung wiederzuverwenden.

Status und Fehler

Beachten Sie, dass PlaybackState ein Objekt ist, das separate Werte für den Wiedergabestatus der Sitzung (getState()) und gegebenenfalls einem zugehörigen Fehlercode (getErrorCode()). Fehler können schwerwiegend oder nicht schwerwiegend sein:

Bei jeder Unterbrechung der Wiedergabe sollte ein schwerwiegender Fehler auftreten: Legen Sie Transportstatus zu STATE_ERROR und geben Sie einen zugehörigen Fehler mit setErrorMessage(int, CharSequence) an. Solange die Wiedergabe durch den Fehler blockiert wird, sollte PlaybackState fortgesetzt werden. um STATE_ERROR und den Fehler zu melden.

Ein nicht schwerwiegender Fehler tritt auf, wenn Ihre App eine Anfrage nicht verarbeiten kann, die Wiedergabe aber trotzdem fortgesetzt werden kann: Der Transport bleibt in einem „normalen“ Zustand. (z. B. STATE_PLAYING), aber PlaybackState enthält einen Fehlercode. Wenn z. B. der letzte Song wiedergegeben wird und der Nutzer zum nächsten Titel springen möchte, Die Wiedergabe kann fortgesetzt werden, aber du solltest eine neue PlaybackState mit dem Fehlercode ERROR_CODE_END_OF_QUEUE und Rufen Sie dann setPlaybackState() auf. An die Sitzung angehängte Mediencontroller empfangen den Callback. onPlaybackStateChanged() und erkläre dem Nutzer, was passiert ist. Ein nicht schwerwiegender Fehler sollte nur einmal zum Zeitpunkt des Auftretens gemeldet werden. Bei der nächsten Aktualisierung des PlaybackState durch die Sitzung wird derselbe nicht schwerwiegende Fehler nicht noch einmal festgelegt (es sei denn, der Fehler ist als Antwort auf eine neue Anfrage aufgetreten).

Sperrbildschirme für Mediensitzungen

Ab Android 4.0 (API-Level 14) kann das System auf die Wiedergabestatus und Metadaten. So können auf dem Sperrbildschirm Mediensteuerelemente angezeigt werden und Artwork. Das Verhalten variiert je nach Android-Version

Albumcover

In Android 4.0 (API-Level 14) bis Android 10 (API-Level 29) wird der Hintergrund des Sperrbildschirms zeigt Ihr Albumcover an, aber nur, wenn die Mediensitzung -Metadaten eine Hintergrund-Bitmap.

Transporteinstellungen

Unter Android 4.0 (API-Level 14) bis Android 4.4 (API-Level 19) werden auf dem Sperrbildschirm automatisch die Transportsteuerelemente angezeigt, wenn eine Mediensitzung aktiv ist und die Metadaten der Mediensitzung eine Bitmap im Hintergrund enthalten.

Ab Android 5.0 (API-Level 21) ist kein Transport möglich. auf dem Sperrbildschirm. Stattdessen sollten Sie einen MediaStyle Benachrichtigung zum Anzeigen der Transportsteuerelemente.

Benutzerdefinierte Aktionen hinzufügen

Medienanwendungen können benutzerdefinierte Aktionen definieren. z. B. „Mag ich“, „Mag ich“ oder 30 Sekunden zurückspulen. Mit einer benutzerdefinierten Aktion sollte eine völlig neue Funktionsweise implementiert werden. Das sollten Sie tun: Keine benutzerdefinierte Aktion verwenden, um eine der standardmäßigen Aktionen für die Transportsteuerung zu ersetzen definiert in WiedergabeStateCompat

Füge mit addCustomAction() benutzerdefinierte Aktionen hinzu. Das folgende Beispiel zeigt, wie Sie ein Steuerelement für eine „Mag ich“-Aktion hinzufügen:

Kotlin

stateBuilder.addCustomAction(
        PlaybackStateCompat.CustomAction.Builder(
                CUSTOM_ACTION_THUMBS_UP,
                resources.getString(R.string.thumbs_up),
                thumbsUpIcon
        ).run {
            setExtras(customActionExtras)
            build()
        }
)

Java

stateBuilder.addCustomAction(new PlaybackStateCompat.CustomAction.Builder(
    CUSTOM_ACTION_THUMBS_UP, resources.getString(R.string.thumbs_up), thumbsUpIcon)
    .setExtras(customActionExtras)
    .build());

Ein vollständiges Beispiel findest du beim Universal Music Player.

Du reagierst auf die Aktion mit onCustomAction().

Kotlin

override fun onCustomAction(action: String, extras: Bundle?) {
    when(action) {
        CUSTOM_ACTION_THUMBS_UP -> {
            ...
        }
    }
}

Java

@Override
public void onCustomAction(@NonNull String action, Bundle extras) {
    if (CUSTOM_ACTION_THUMBS_UP.equals(action)) {
        ...
    }
}

Weitere Informationen finden Sie unter Universal Music Player.

Rückrufe für Mediensitzungen

Die wichtigsten Callback-Methoden für Mediensitzungen sind onPlay(), onPause() und onStop(). Hier fügen Sie den Code ein, der Ihren Player steuert.

Da Sie den Callback der Sitzung zur Laufzeit (in onCreate()) instanziieren und festlegen, kann Ihre App alternative Callbacks mit unterschiedlichen Playern definieren und je nach Geräte- und/oder Systemebene die geeignete Callback-Spieler-Kombination auswählen. Du kannst den Player ändern, ohne den Rest der App zu ändern. Sie könnten beispielsweise ExoPlayer auf Geräten mit Android 4.1 (API-Level 16) oder höher verwenden und auf älteren Systemen MediaPlayer verwenden.

Mit Callbacks können nicht nur der Player gesteuert und die Statusübergänge bei Mediensitzungen verwaltet werden, sondern auch Funktionen Ihrer App aktiviert und deaktiviert werden. Außerdem steuern Sie damit, wie sie mit anderen Apps und der Gerätehardware interagiert. Weitere Informationen finden Sie unter Audioausgabe steuern.

Die Implementierung der Callback-Methoden für Mediensitzungen hängt von der Struktur deiner App ab. Weitere Informationen finden Sie auf den Seiten, auf denen die Verwendung von Callbacks beschrieben wird. Audio-Apps und Video-Apps, beschreiben, wie die Callbacks für jede Art von App implementiert werden sollten.