1. Einführung
Letzte Aktualisierung:09.09.2020
Welche Vorteile bietet das Hinzufügen einer MediaSession zur Videowiedergabe ?
Mediensitzungen sind ein integraler Bestandteil der Verbindung zwischen der Android-Plattform und Medien-Apps. Sie informieren Android nicht nur darüber, dass Medien wiedergegeben werden, damit Medienaktionen an die richtige Sitzung weitergeleitet werden können, sondern auch darüber, was wiedergegeben wird und wie die Wiedergabe gesteuert werden kann.
Das Bereitstellen einer MediaSession über Ihre App bietet verschiedene Vorteile für Nutzer. Hier einige Beispiele:
Google Assistant
Nutzer können ganz einfach per Sprachbefehl mit Medien in Ihrer App interagieren, z. B. mit „Pause“, „Fortsetzen“ und „Weiter“. Außerdem können sie Metadaten aus Ihren Medien verwenden, um Antworten auf Fragen zur aktuellen Wiedergabe zu erhalten.
Android TV
Auf großen Bildschirmen kann Ihre Android TV-App herkömmliche Fernbedienungen für Nutzer mit Fernsehern verwenden, die HDMI-CEC unterstützen. Befehle, die über die Schaltflächen „Wiedergabe/Pause“, „Stopp“, „Weiter“ und „Zurück“ ausgegeben werden, werden an Ihre App weitergeleitet.
Mediensteuerungen auf dem Bildschirm
Ab Android 4.0 (API-Ebene 14) kann das System auf den Wiedergabestatus und die Metadaten einer Mediensitzung zugreifen. Mit dieser Funktion können auf dem Sperrbildschirm Mediensteuerungen und Grafiken angezeigt werden. Das Verhalten variiert je nach Android-Version.
Medien im Hintergrund
Medien können in allen diesen Szenarien gesteuert werden, auch wenn die App, die die Medien wiedergibt, im Hintergrund ausgeführt wird.
Umgebungsberechnung
Wenn Sie Ihre Medien mit Daten zur Wiedergabe und Steuerung bereitstellen, können Sie eine Verbindung zwischen Geräten herstellen, sodass Nutzer auf verschiedene Weise damit interagieren können.
Was Sie erstellen
In diesem Codelab erweitern Sie das vorhandene ExoPlayer-Beispiel, um Unterstützung für Mediensitzungen hinzuzufügen. Ihre App wird Folgendes tun:
- Den aktiven Status der Mediensitzung korrekt wiedergeben
- Mediensteuerungen an ExoPlayer weiterleiten
- Metadaten von Elementen in der Warteschlange an die Mediensitzung übergeben
Lerninhalte
- Warum Mediensitzungen Nutzern ein besseres Erlebnis bieten
- Wie Sie eine Mediensitzung erstellen und ihren Status verwalten
- Wie Sie eine Mediensitzung mit ExoPlayer verbinden
- Wie Sie Metadaten von Elementen in der Wiedergabewarteschlange in die Mediensitzung einbeziehen
- Wie Sie zusätzliche (benutzerdefinierte) Aktionen hinzufügen
In diesem Codelab geht es um das MediaSession SDK. Irrelevante Konzepte und Codeblöcke, einschließlich Details zur ExoPlayer-Implementierung, werden nicht behandelt, können aber einfach kopiert und eingefügt werden.
Voraussetzungen
- Eine aktuelle Version von Android Studio (3.5 oder höher)
- Grundkenntnisse in der Entwicklung von Android-Anwendungen
2. Einrichtung
Was ist unser Ausgangspunkt?
Unser Ausgangspunkt ist die Hauptdemo von ExoPlayer. Diese Demo enthält Videos mit Wiedergabesteuerungen auf dem Bildschirm, verwendet aber keine Mediensitzungen. Hier können wir sie hinzufügen.
ExoPlayer-Beispiel abrufen
Beginnen wir mit dem ExoPlayer-Beispiel. Klonen Sie das GitHub-Repository, indem Sie den folgenden Code ausführen.
git clone https://github.com/google/ExoPlayer.git
Demo öffnen
Öffnen Sie in Android Studio das Hauptdemoprojekt unter demos/main.
Android Studio fordert Sie auf, den SDK-Pfad festzulegen. Wenn Probleme auftreten, folgen Sie den Empfehlungen zum Aktualisieren der IDE- und SDK-Tools.

Wenn Sie aufgefordert werden, die neueste Gradle-Version zu verwenden, aktualisieren Sie sie.
Nehmen Sie sich einen Moment Zeit, um die grundlegende Struktur der App zu verstehen. Es gibt zwei Aktivitäten: SampleChooserActivity und PlayerActivity. Den Rest des Codelabs verbringen wir in PlayerActivity, wo die Medien tatsächlich wiedergegeben werden. Öffnen Sie also diese Klasse und fahren Sie mit dem nächsten Abschnitt fort.
3. Mediensitzung erstellen und Status verwalten
Mediensitzung erstellen
Öffnen Sie PlayerActivity.java. Diese Klasse erstellt den ExoPlayer und verwaltet seine Funktionen, z. B. das Rendern von Videos auf dem Bildschirm. In dieser Aktivität verbinden wir den ExoPlayer mit einer Mediensitzung.
Deklarieren Sie die folgenden beiden Felder oben in der Klasse. Wir verwenden diese Felder in diesem Abschnitt.
private MediaSessionCompat mediaSession;
private MediaSessionConnector mediaSessionConnector;
Sie müssen die Projektabhängigkeit „extension-mediasession“ in die build.gradle-Datei auf Modulebene für „Module: demo“ einfügen:
implementation project(path: ':extension-mediasession')
Android Studio kann Ihnen helfen, diese Abhängigkeit automatisch hinzuzufügen, wenn Sie den Mauszeiger auf den Fehler beim Auflösen von MediaSessionConnector bewegen:

Fügen Sie abschließend die folgenden Klassenimporte hinzu:
import android.support.v4.media.session.MediaSessionCompat;
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;
Wenn die Aktivität erstellt wird, möchten wir eine Mediensitzung und einen MediaSessionConnector erstellen, der als Vermittler zwischen der Mediensitzung und ExoPlayer dient.
Der ideale Ort dafür ist dort, wo auch ExoPlayer erstellt wird. In unserer Demo-App können wir den Code an das Ende von initializePlayer() anhängen. Fügen Sie diese Logik nachdem der Player instanziiert wurde hinzu.
private void initializePlayer() {
if (player == null) {
...
player = ...
...
mediaSession = new MediaSessionCompat(this, "sample");
mediaSessionConnector = new MediaSessionConnector(mediaSession);
mediaSessionConnector.setPlayer(player);
}
...
}
Mediensitzung freigeben
Geben Sie die Mediensitzung frei, wenn sie nicht mehr benötigt wird. Wenn wir ExoPlayer in releasePlayer() freigeben, können wir auch den folgenden Code verwenden:
private void releasePlayer() {
if (mediaSession != null) {
mediaSession.release();
}
...
}
Status der Mediensitzung verwalten
Nachdem wir die Mediensitzung instanziiert haben, müssen wir dafür sorgen, dass ihr Status korrekt wiedergegeben wird, wenn der Nutzer mit der Aktivität interagiert.
Wenn der Nutzer die Aktivität startet, sollte die Mediensitzung aktiv werden:
@Override
public void onStart() {
...
if (mediaSession != null) {
mediaSession.setActive(true);
}
}
Da unsere Anwendung keine Medien im Hintergrund wiedergibt, muss die Mediensitzung inaktiv werden, wenn der Nutzer die Aktivität verlässt:
@Override
public void onStop() {
super.onStop();
if (mediaSession != null) {
mediaSession.setActive(false);
}
...
}
Demo ausführen
- Schließen Sie ein Android-Gerät an oder starten Sie einen Emulator.
- Achten Sie darauf, dass in der Android Studio-Symbolleiste „demo“ ausgewählt ist.

- Klicken Sie in der Android Studio-Symbolleiste auf
. - Nachdem die App auf Ihrem Gerät gestartet wurde, wählen Sie einen Videostream zur Wiedergabe aus.
- Sobald die Wiedergabe beginnt, können Sie die folgenden
adb-Befehle verwenden, um die Mediensitzung zu steuern:
adb shell media dispatch pause
adb shell media dispatch play
adb shell media dispatch play-pause
adb shell media dispatch fast-forward
adb shell media dispatch rewind
- Sehen Sie sich auch an, wie Android Ihre Mediensitzung sieht. Insbesondere können Sie im Feld „Aktion“ prüfen, welche Aktionen unterstützt werden. Die hier angezeigte Zahl ist eine Kombination aus Aktions-IDs, wie im PlaybackState-Objekt deklariert. So sehen Sie die Mediensitzung:
adb shell dumpsys media_session - Wenn Sie ein physisches Gerät mit einem Mikrofon verwenden, rufen Sie Google Assistant auf und geben Sie Sprachbefehle aus, z. B. „Pause“. „Fortsetzen“ „Eine Minute vorspulen“
ExoPlayer-Beispiel auf Android TV
4. Metadaten von Elementen in der Wiedergabewarteschlange einbeziehen
Wir können jetzt die unterstützten Funktionen unserer Mediensitzung erweitern, in der wir zuvor unseren MediaSessionConnector in initializePlayer() erstellt haben.
TimelineQueueNavigator hinzufügen
ExoPlayer stellt die Struktur von Medien als Zeitachse dar. Weitere Informationen dazu finden Sie im Artikel zum Timeline-Objekt von ExoPlayer. Wenn wir diese Struktur nutzen, können wir benachrichtigt werden, wenn sich Inhalte ändern, und auf Anfrage Metadaten zur aktuellen Wiedergabe bereitstellen.
Dazu definieren wir einen TimelineQueueNavigator. Suchen Sie die Instanziierung von MediaSessionConnector in initializePlayer() und fügen Sie eine Implementierung von TimelineQueueNavigator nachdem mediaSession initialisiert wurde hinzu.
mediaSessionConnector.setQueueNavigator(new TimelineQueueNavigator(mediaSession) {
@Override
public MediaDescriptionCompat getMediaDescription(Player player, int windowIndex) {
return new MediaDescriptionCompat.Builder()
.setTitle(player.getCurrentMediaItem().mediaMetadata.title)
.setDescription("MediaDescription description for " + windowIndex)
.setSubtitle("MediaDescription subtitle")
.build();
}
});
Fügen Sie die folgenden Klassenimporte hinzu:
import android.support.v4.media.MediaDescriptionCompat;
import com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator;
Der Parameter windowIndex entspricht dem Element mit diesem Index in der Wiedergabewarteschlange.
Nachdem Sie einige Metadaten hinzugefügt haben, können Sie testen, ob der Assistant versteht, was wiedergegeben wird. Rufen Sie während der Wiedergabe eines Videos auf Android TV den Assistant auf und fragen Sie „Was wird wiedergegeben?“

5. Aktionen anpassen
Vielleicht unterstützt Ihr Player einige Aktionen nicht oder Sie möchten Unterstützung für weitere Aktionen hinzufügen. Sehen wir uns nun die Mediensitzung genauer an, in der wir zuvor unseren MediaSessionConnector in initializePlayer() erstellt haben.
Unterstützte Aktionen deklarieren
Verwenden Sie mediaSessionConnector.setEnabledPlaybackActions(), um anzupassen, welche Aktionen von der Mediensitzung unterstützt werden sollen.
Die vollständige Liste ist:
mediaSessionConnector.setEnabledPlaybackActions(
PlaybackStateCompat.ACTION_PLAY_PAUSE
| PlaybackStateCompat.ACTION_PLAY
| PlaybackStateCompat.ACTION_PAUSE
| PlaybackStateCompat.ACTION_SEEK_TO
| PlaybackStateCompat.ACTION_FAST_FORWARD
| PlaybackStateCompat.ACTION_REWIND
| PlaybackStateCompat.ACTION_STOP
| PlaybackStateCompat.ACTION_SET_REPEAT_MODE
| PlaybackStateCompat.ACTION_SET_SHUFFLE_MODE
);
Sehen wir uns noch einmal an, wie diese Daten für die Plattform bereitgestellt werden:
- Starten Sie wie zuvor ein Video.
- Sehen Sie sich an, wie Android die Metadaten aus Ihrer Mediensitzung sieht, indem Sie
adb shell dumpsys media_sessionausführen. - Suchen Sie die Zeile mit den Metadaten und sehen Sie, dass Titel und Beschreibung enthalten und mit
com.google.android.exoplayer2.demo/sampleverknüpft sind.
Zusätzliche Aktionen hinzufügen
Wir können unsere Mediensitzung um einige zusätzliche Aktionen erweitern. In diesem Abschnitt fügen wir nur Unterstützung für Untertitel hinzu.
Untertitel unterstützen
Wenn Sie Mediensitzungen Unterstützung für Untertitel hinzufügen, können Nutzer sie per Sprachbefehl ein- und ausschalten. Fügen Sie an der Stelle, an der Sie den MediaSessionConnector initialisiert haben, Folgendes hinzu:
mediaSessionConnector.setCaptionCallback(new MediaSessionConnector.CaptionCallback() {
@Override
public void onSetCaptioningEnabled(Player player, boolean enabled) {
Log.d("MediaSession", "onSetCaptioningEnabled: enabled=" + enabled);
}
@Override
public boolean hasCaptions(Player player) {
return true;
}
@Override
public boolean onCommand(Player player, ControlDispatcher controlDispatcher, String command, Bundle extras, ResultReceiver cb) {
return false;
}
}
);
Beheben Sie abschließend alle fehlenden Importe.
Sie können dies testen, indem Sie Google Assistant auf Android TV aufrufen und „Untertitel aktivieren“ sagen. Suchen Sie in Logcat nach Nachrichten, um zu sehen, wie dies in Ihrem Code aufgerufen wird.
6. Glückwunsch
Glückwunsch, Sie haben dem Beispiel erfolgreich Mediensitzungen hinzugefügt.
Sie haben eine enorme Menge an Funktionen erhalten, indem Sie Folgendes getan haben:
- Mediensitzung hinzugefügt
- Mediensitzungen mit einer Instanz von ExoPlayer verbunden
- Metadaten und zusätzliche Aktionen hinzugefügt
Sie kennen jetzt die wichtigsten Schritte, die erforderlich sind, um eine Medien-App zu erweitern und Nutzern ein vielseitigeres Erlebnis zu bieten.
Eine letzte Anmerkung
Dieses Codelab basiert auf einem Beispiel aus dem ExoPlayer-Quellcode. Sie müssen ExoPlayer nicht aus der Quelle verwenden. Stattdessen sollten Sie die Abhängigkeiten für ExoPlayer und MediaSessionConnector abrufen, damit Sie leichter auf dem neuesten Stand bleiben.
Ersetzen Sie dazu einfach die Projektabhängigkeiten, z. B.:
implementation project(modulePrefix + 'library-core')
implementation project(path: ':extension-mediasession')
um sie aus Maven-Repositories abzurufen, z. B.:
implementation 'com.google.android.exoplayer:exoplayer-core:2.+'
implementation 'com.google.android.exoplayer:extension-mediasession:2.+'