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, diePlaybackStateCompat.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 auf dem 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ügst du den Code hinzu, der deinen 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.