ExoPlayer ist ein Mediaplayer auf Anwendungsebene für Android. In diesem Leitfaden erfahren Sie, wie Sie die ExoPlayer IMA-Erweiterung das das IMA DAI SDK umschließt, um einen Mediastream mit sowohl Anzeigen als auch Content.
Die Erweiterung bietet unter anderem folgende Vorteile:
- Vereinfacht den Code, der für die Integration von IMA-Funktionen erforderlich ist
- Verkürzt die Entwicklungszeit für die Aktualisierung auf neue IMA-Versionen.
Die IMA-Erweiterung ExoPlayer unterstützt HLS- und DASH-Streamingprotokolle. Hier ist ein Zusammenfassung:
Unterstützung für ExoPlayer-IMA-Erweiterungsstreams | ||
---|---|---|
Livestream | VOD-Streams | |
HLS | ![]() |
![]() |
DASH | ![]() |
![]() |
DASH-Livestreams werden ab der ExoPlayer-IMA-Version 1.1.0 unterstützt.
Diese Anleitung basiert auf dem ExoPlayer
und zeigt,
wie eine vollständige App erstellt und die Erweiterung integriert wird. Weitere Informationen finden Sie in der
ExoPlayerExample
von
GitHub mit einem Beispiel
eine vollständige Beispiel-App.
Vorbereitung
- Android Studio
- AndroidX Media3 ExoPlayer Version 1.0.0 oder höher für die dynamische Anzeigenbereitstellung Support.
Ein neues Android Studio-Projekt erstellen
Führen Sie die folgenden Schritte aus, um Ihr Android Studio-Projekt zu erstellen:
- Starte Android Studio.
- Wählen Sie Start a new Android Studio project aus.
- Wähle auf der Seite Projekt auswählen die Vorlage Keine Aktivität aus.
- Klicken Sie auf Weiter.
Geben Sie auf der Seite Projekt konfigurieren einen Namen für Ihr Projekt ein und wählen Sie die Sprache.
Klicken Sie auf Fertig.
ExoPlayer-IMA-Erweiterung zu Ihrem Projekt hinzufügen
Fügen Sie der Datei build.gradle auf Anwendungsebene Importe für die Erweiterung hinzu.
im Abschnitt dependencies
.
Konfigurieren und aktivieren Sie Ihre App
multidex. Dies ist notwendig,
an die Größe der Erweiterung an und ist für Apps erforderlich, bei denen minSdkVersion
festgelegt ist
auf Android 4.4W (API-Level)
20) oder niedriger.
Beispiel:
app/build.gradle
android { ... defaultConfig { applicationId "com.google.ads.interactivemedia.v3.samples.videoplayerapp" minSdkVersion 21 targetSdkVersion 34 multiDexEnabled true versionCode 1 versionName "1.0" } ... } dependencies { implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.media3:media3-ui:1.1.1' implementation 'androidx.media3:media3-exoplayer:1.1.1' implementation 'androidx.media3:media3-exoplayer-hls:1.1.1' implementation 'androidx.media3:media3-exoplayer-dash:1.1.1' // Adding the ExoPlayer IMA extension for ads will also include the IMA // SDK as a dependency. implementation 'androidx.media3:media3-exoplayer-ima:1.1.1' }
Fügen Sie die Nutzerberechtigungen hinzu, die vom IMA DAI SDK zum Anfordern von Anzeigen benötigt werden:
app/src/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.project name"> <!-- Required permissions for the IMA DAI SDK --> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> ... </manifest>
Intent-Deklarationen hinzufügen
Wenn deine App auf Android 11 (API-Level 30) oder höher ausgerichtet ist, werden die aktuelle und die Versionen des IMA DAI SDK erfordern eine explizite Absichtserklärung zum Öffnen von Websites Links. Fügen Sie der Manifestdatei Ihrer App das folgende Snippet hinzu, um die Anzeigenklicks (Nutzer, die auf die Schaltfläche Weitere Informationen klicken)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.project name"> ... </application> <queries> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="https" /> </intent> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="http" /> </intent> </queries> </manifest>
Benutzeroberfläche von ExoPlayer einrichten
Erstellen Sie das PlayerView
-Objekt, das von ExoPlayer verwendet werden soll.
Ändern Sie androidx.constraintlayout.widget.ConstraintLayout
zu
LinearLayout
, die für die ExoPlayer IMA-Erweiterung empfohlen wird.
Beispiel:
app/src/main/res/layout/activity_my.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:background="@android:color/black" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MyActivity" tools:ignore="MergeRootFrame"> <androidx.media3.ui.PlayerView android:id="@+id/player_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
Streamparameter hinzufügen
Siehe IMA-Beispielstream für den Beispielstream. um Ihr Projekt zu testen. Weitere Informationen finden Sie im Abschnitt zu Ad Manager dynamische Anzeigenbereitstellung, um Informationen zum Einrichten eigenen Streams erstellen.
In diesem Schritt wird die Einrichtung eines Livestreams veranschaulicht. Die ExoPlayer-IMA- unterstützt auch VOD-Streams für die dynamische Anzeigenbereitstellung. Siehe Schritt für Video-on-Demand (VOD) Streams um zu sehen, welche Änderungen Ihre App zur Verarbeitung von VOD-Streams benötigt.
ExoPlayer IMA-Erweiterung importieren
Fügen Sie die Importanweisungen für die ExoPlayer-Erweiterung hinzu.
Fügen Sie MyActivity.java
die folgenden privaten Variablen hinzu:
PlayerView
ExoPlayer
ImaServerSideAdInsertionMediaSource.AdsLoader
ImaServerSideAdInsertionMediaSource.AdsLoader.State
Fügen Sie den Assetschlüssel des HLS-Streams Big Buck Bunny (Live) hinzu, um ihn zu testen . Es sind weitere Streams zum Testen verfügbar Beispiel-Stream-Seite von IMA.
Erstellen Sie eine KEY_ADS_LOADER_STATE
-Konstante, um die AdsLoader
zu speichern und abzurufen.
Bundesstaat.
Beispiel:
app/src/main/java/com/example/project name/MyActivity.java
import static androidx.media3.common.C.CONTENT_TYPE_HLS; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import androidx.annotation.Nullable; import androidx.annotation.OptIn; import androidx.media3.common.MediaItem; import androidx.media3.common.util.Util; import androidx.media3.datasource.DataSource; import androidx.media3.datasource.DefaultDataSource; import androidx.media3.exoplayer.ExoPlayer; import androidx.media3.exoplayer.ima.ImaServerSideAdInsertionMediaSource; import androidx.media3.exoplayer.ima.ImaServerSideAdInsertionUriBuilder; import androidx.media3.exoplayer.source.DefaultMediaSourceFactory; import androidx.media3.exoplayer.util.EventLogger; import androidx.media3.ui.PlayerView; import androidx.multidex.MultiDex; ... public class MyActivity extends Activity</span> { private static final String KEY_ADS_LOADER_STATE = "ads_loader_state"; private static final String SAMPLE_ASSET_KEY = "c-rArva4ShKVIAkNfy6HUQ"; private PlayerView playerView; private ExoPlayer player; private ImaServerSideAdInsertionMediaSource.AdsLoader adsLoader; private ImaServerSideAdInsertionMediaSource.AdsLoader.State adsLoaderState;</span> }
adsLoader
-Instanz erstellen
Überschreiben Sie die Methode onCreate
, um PlayerView
zu finden und nach einem gespeicherten
AdsLoader.State
,
der beim Initiieren des adsLoader
-Objekts verwendet werden kann.
Aktivieren Sie Multidex auch, wenn dies für die Methodenanzahl und minSdkVersion
Ihrer App erforderlich ist.
(wie in den
Schritt 2).
Beispiel:
app/src/main/java/com/example/project name/MyActivity.java
... public class MyActivity extends Activity { private static final String KEY_ADS_LOADER_STATE = "ads_loader_state"; private static final String SAMPLE_ASSET_KEY = "c-rArva4ShKVIAkNfy6HUQ"; private PlayerView playerView; private ExoPlayer player; private ImaServerSideAdInsertionMediaSource.AdsLoader adsLoader; private ImaServerSideAdInsertionMediaSource.AdsLoader.State adsLoaderState; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); MultiDex.install(this); playerView = findViewById(R.id.player_view); // Checks if there is a saved AdsLoader state to be used later when // initiating the AdsLoader. if (savedInstanceState != null) { Bundle adsLoaderStateBundle = savedInstanceState.getBundle(KEY_ADS_LOADER_STATE); if (adsLoaderStateBundle != null) { adsLoaderState = ImaServerSideAdInsertionMediaSource.AdsLoader.State.fromBundle( adsLoaderStateBundle); } } } }
Methoden zum Initialisieren des Players hinzufügen
Füge eine Methode zum Initialisieren des Players hinzu und führe folgende Schritte aus:
- Erstellen Sie eine
AdsLoader
-Instanz. - Erstellen Sie
ExoPlayer
. - Erstelle eine
MediaItem
mit dem Assetschlüssel des Livestreams. - Lege
MediaItem
auf deinen Player fest.
Beispiel:
app/src/main/java/com/example/project name/MyActivity.java
public class MyActivity extends Activity { ... // Create a server side ad insertion (SSAI) AdsLoader. private ImaServerSideAdInsertionMediaSource.AdsLoader createAdsLoader() { ImaServerSideAdInsertionMediaSource.AdsLoader.Builder adsLoaderBuilder = new ImaServerSideAdInsertionMediaSource.AdsLoader.Builder(this, playerView); // Attempt to set the AdsLoader state if available from a previous session. if (adsLoaderState != null) { adsLoaderBuilder.setAdsLoaderState(adsLoaderState); } return adsLoaderBuilder.build(); } private void initializePlayer() { adsLoader = createAdsLoader(); // Set up the factory for media sources, passing the ads loader. DataSource.Factory dataSourceFactory = new DefaultDataSource.Factory(this); DefaultMediaSourceFactory mediaSourceFactory = new DefaultMediaSourceFactory(dataSourceFactory); // MediaSource.Factory to create the ad sources for the current player. ImaServerSideAdInsertionMediaSource.Factory adsMediaSourceFactory = new ImaServerSideAdInsertionMediaSource.Factory(adsLoader, mediaSourceFactory); // 'mediaSourceFactory' is an ExoPlayer component for the DefaultMediaSourceFactory. // 'adsMediaSourceFactory' is an ExoPlayer component for a MediaSource factory for IMA server // side inserted ad streams. mediaSourceFactory.setServerSideAdInsertionMediaSourceFactory(adsMediaSourceFactory); // Create an ExoPlayer and set it as the player for content and ads. player = new ExoPlayer.Builder(this).setMediaSourceFactory(mediaSourceFactory).build(); playerView.setPlayer(player); adsLoader.setPlayer(player); // Build an IMA SSAI media item to prepare the player with. Uri ssaiLiveUri = new ImaServerSideAdInsertionUriBuilder() .setAssetKey(SAMPLE_ASSET_KEY) .setFormat(CONTENT_TYPE_HLS) // Use CONTENT_TYPE_DASH for dash streams. .build(); // Create the MediaItem to play, specifying the stream URI. MediaItem ssaiMediaItem = MediaItem.fromUri(ssaiLiveUri); // Prepare the content and ad to be played with the ExoPlayer. player.setMediaItem(ssaiMediaItem); player.prepare(); // Set PlayWhenReady. If true, content and ads will autoplay. player.setPlayWhenReady(false); } }
Methode zum Freigeben des Players hinzufügen
Füge eine Methode hinzu, um den Player in dieser Sequenz freizugeben:
- Setze die Spielerverweise auf null und gib die Ressourcen des Spielers frei.
- Geben Sie den Status von
adsLoader
frei.
app/src/main/java/com/example/project name/MyActivity.java
public class MyActivity extends Activity { ... private void releasePlayer() { // Set the player references to null and release the player's resources. playerView.setPlayer(null); player.release(); player = null; // Release the adsLoader state so that it can be initiated again. adsLoaderState = adsLoader.release(); }
Player-Ereignisse verarbeiten
Erstellen Sie schließlich Callbacks für die Lebenszyklusereignisse der Aktivität, um den Stream zu verarbeiten. Wiedergabe starten.
So unterstützen Sie Android SDK Version 24 oder höher:
So unterstützen Sie Android SDK-Versionen unter 24:
– onResume()
– onPause()
onStart()
und onResume()
werden playerView.onResume()
zugeordnet und onStop()
und
onPause()
zugeordnet zu playerView.onPause()
.
In diesem Schritt wird auch die Methode
onSaveInstanceState()
, um adsLoaderState
zu speichern.
app/src/main/java/com/example/project name/MyActivity.java
public class MyActivity extends Activity { ... @Override public void onStart() { super.onStart(); if (Util.SDK_INT > 23) { initializePlayer(); if (playerView != null) { playerView.onResume(); } } } @Override public void onResume() { super.onResume(); if (Util.SDK_INT <= 23 || player == null) { initializePlayer(); if (playerView != null) { playerView.onResume(); } } } @Override public void onPause() { super.onPause(); if (Util.SDK_INT <= 23) { if (playerView != null) { playerView.onPause(); } releasePlayer(); } } @Override public void onStop() { super.onStop(); if (Util.SDK_INT > 23) { if (playerView != null) { playerView.onPause(); } releasePlayer(); } } @Override public void onSaveInstanceState(Bundle outState) { // Attempts to save the AdsLoader state to handle app backgrounding. if (adsLoaderState != null) { outState.putBundle(KEY_ADS_LOADER_STATE, adsLoaderState.toBundle()); } } ... }
VOD-Stream einrichten (optional)
Wenn deine App VOD-Inhalte mit Anzeigen wiedergeben muss, musst du Folgendes tun: Folgendes:
- Füge für einen VOD-Teststream
CMS ID
undVideo ID
hinzu. - Erstellen Sie mit
ImaServerSideAdInsertionUriBuilder()
einen VOD-URI für die serverseitige Anzeigenbereitstellung. - Verwende diesen neuen URI als Medienelement deines Players.
app/src/main/java/com/example/project name/MyActivity.java
public class MyActivity extends Activity { private static final String KEY_ADS_LOADER_STATE = "ads_loader_state"; private static final String SAMPLE_ASSET_KEY = "c-rArva4ShKVIAkNfy6HUQ"; private static final String SAMPLE_CMS_ID = "2548831"; private static final String SAMPLE_VIDEO_ID = "tears-of-steel"; ... private void initializePlayer() { ... Uri ssaiVodUri = new ImaServerSideAdInsertionUriBuilder() .setContentSourceId(SAMPLE_CMS_ID) .setVideoId(SAMPLE_VIDEO_ID) .setFormat(CONTENT_TYPE_HLS) .build(); // Create the MediaItem to play, specifying the stream URI. MediaItem ssaiMediaItem = MediaItem.fromUri(ssaiVodUri); // Prepare the content and ad to be played with the ExoPlayer. player.setMediaItem(ssaiMediaItem); player.prepare(); // Set PlayWhenReady. If true, content and ads will autoplay. player.setPlayWhenReady(false); }
Fertig! Sie fordern jetzt einen Media-Stream mit dem ExoPlayer an und geben ihn wieder IMA-Erweiterung. Sehen Sie sich Beispiele für die dynamische Anzeigenbereitstellung unter Android GitHub für den vollständigen Code.