Pakiety IMA SDK ułatwiają integrację reklam multimedialnych z witrynami i aplikacjami. Pakiety IMA SDK mogą wysyłać żądania reklam do dowolnego serwera reklam zgodnego z VAST i zarządzać odtwarzaniem reklam w aplikacjach. Dzięki pakietom IMA SDK po stronie klienta zachowujesz kontrolę nad odtwarzaniem treści wideo, a pakiet SDK obsługuje odtwarzanie reklam. Reklamy są odtwarzane w osobnym odtwarzaczu wideo umieszczonym nad odtwarzaczem wideo z treściami aplikacji.
Z tego przewodnika dowiesz się, jak zintegrować pakiet IMA SDK z pustym projektem w Android Studio za pomocą rozszerzenia ExoPlayer IMA. Jeśli chcesz wyświetlić gotową przykładową integrację lub śledzić jej przebieg, pobierz BasicExample z GitHuba.
Omówienie IMA po stronie klienta
Wdrażanie pakietu IMA SDK po stronie klienta obejmuje 4 główne komponenty SDK, które zostały przedstawione w tym przewodniku:
AdDisplayContainer
: obiekt kontenera, który określa, gdzie IMA renderuje elementy interfejsu reklamy i mierzy widoczność, w tym Widok aktywny i Open Measurement.AdsLoader
: obiekt, który wysyła żądania reklam i obsługuje zdarzenia z odpowiedzi na żądania reklam. Powinieneś utworzyć tylko jeden moduł wczytywania reklam, którego można używać przez cały okres działania aplikacji.AdsRequest
: obiekt, który definiuje żądanie reklamy. Żądania reklam określają adres URL tagu reklamy VAST, a także dodatkowe parametry, takie jak wymiary reklamy.AdsManager
: Obiekt, który zawiera odpowiedź na żądanie reklamy, kontroluje odtwarzanie reklam i nasłuchuje zdarzeń reklamowych wywoływanych przez pakiet SDK.
Wymagania wstępne
Zanim zaczniesz, musisz mieć Android Studio w wersji 3.0 lub nowszej.
1. Tworzenie nowego projektu Android Studio
Aby utworzyć projekt Android Studio, wykonaj te czynności:
- Uruchom Android Studio.
- Kliknij Rozpocznij nowy projekt w Android Studio.
- Na stronie Wybierz projekt kliknij szablon Puste działanie.
- Kliknij Dalej.
- Na stronie Skonfiguruj projekt nadaj projektowi nazwę i wybierz język Java.
- Kliknij Zakończ.
2. Dodawanie do projektu rozszerzenia ExoPlayer IMA
Najpierw w pliku build.gradle na poziomie aplikacji dodaj importy rozszerzenia do sekcji zależności. Ze względu na rozmiar rozszerzenia ExoPlayer IMA zaimplementuj i włącz tutaj multidex. Jest to konieczne w przypadku aplikacji, w których wartość parametru minSdkVersion
jest ustawiona na 20 lub mniej.
Dodaj też nowy element compileOptions
, aby określić informacje o zgodności z wersją Java.
apply plugin: 'com.android.application' android { namespace 'com.google.ads.interactivemedia.v3.samples.exoplayerexample' compileSdk 36 // Java 17 required by Gradle 8+ compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } defaultConfig { applicationId "com.google.ads.interactivemedia.v3.samples.exoplayerexample" minSdkVersion 21 targetSdkVersion 36 multiDexEnabled true versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } repositories { google() mavenCentral() } dependencies { def media3_version = "1.8.0" implementation "androidx.media3:media3-ui:$media3_version" implementation "androidx.media3:media3-exoplayer:$media3_version" // The library adds the IMA ExoPlayer integration for ads. implementation "androidx.media3:media3-exoplayer-ima:$media3_version" implementation 'androidx.multidex:multidex:2.0.1' }
3. Tworzenie kontenera interfejsu reklamy
Utwórz widok, który będzie używany jako ExoPlayer PlayerView, tworząc androidx.media3.ui.PlayerView
. Zmień też androidx.constraintlayout.widget.ConstraintLayout
na LinearLayout
.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" 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="wrap_content" /> <!-- UI element for viewing SDK event log --> <TextView android:id="@+id/logText" android:gravity="bottom" android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="100" android:scrollbars="vertical" android:textSize="@dimen/font_size"> </TextView> </LinearLayout>
4. Importowanie rozszerzenia IMA odtwarzacza ExoPlayer
Dodaj instrukcje importu dla rozszerzenia ExoPlayer:
import static android.os.Build.VERSION.SDK_INT; import android.annotation.SuppressLint; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.text.method.ScrollingMovementMethod; import android.util.Log; import android.widget.TextView; import androidx.media3.common.MediaItem; import androidx.media3.datasource.DataSource; import androidx.media3.datasource.DefaultDataSource; import androidx.media3.exoplayer.ExoPlayer; import androidx.media3.exoplayer.ima.ImaAdsLoader; import androidx.media3.exoplayer.source.DefaultMediaSourceFactory; import androidx.media3.exoplayer.source.MediaSource; import androidx.media3.ui.PlayerView; import androidx.multidex.MultiDex; import com.google.ads.interactivemedia.v3.api.AdEvent; import com.google.ads.interactivemedia.v3.api.ImaSdkFactory; import com.google.ads.interactivemedia.v3.api.ImaSdkSettings;
Następnie zaktualizuj klasę MainActivity
, aby rozszerzyć klasę Activity
, dodając zmienne prywatne dla PlayerView
, ExoPlayer
, ImaAdsLoader
i ImaSdkSettings
:
/** Main Activity. */ @SuppressLint("UnsafeOptInUsageError") /* @SuppressLint is needed for new media3 APIs. */ public class MyActivity extends Activity { private static final String SAMPLE_VIDEO_URL = "https://storage.googleapis.com/gvabox/media/samples/stock.mp4"; private static final String SAMPLE_VAST_TAG_URL = "https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/" + "single_ad_samples&sz=640x480&cust_params=sample_ct%3Dlinear&ciu_szs=300x250%2C728x90" + "&gdfp_req=1&output=vast&unviewed_position_start=1&env=vp&correlator="; private static final String LOG_TAG = "ImaExoPlayerExample"; private PlayerView playerView; private TextView logText; private ExoPlayer player; private ImaAdsLoader adsLoader; private ImaSdkSettings imaSdkSettings;
5. Tworzenie instancji adsLoader
Zastąp metodę onCreate
i dodaj wymagane przypisania zmiennych, aby utworzyć nowy obiekt adsLoader
z adresem URL tagu reklamy.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); MultiDex.install(this); // Initialize the IMA SDK as early as possible when the app starts. If your app already // overrides Application.onCreate(), call this method inside the onCreate() method. // https://developer.android.com/topic/performance/vitals/launch-time#app-creation ImaSdkFactory.getInstance().initialize(this, getImaSdkSettings()); playerView = findViewById(R.id.player_view); // Create an AdsLoader. adsLoader = new ImaAdsLoader.Builder(/* context= */ this) .setAdEventListener(buildAdEventListener()) .setImaSdkSettings(getImaSdkSettings()) .build(); }
Utwórz metodę buildAdEventListener()
, która zwraca obiekt AdEventListener
do rejestrowania zdarzeń IMA na potrzeby debugowania. Rozszerzenie ExoPlayer IMA obsługuje już zdarzenia IMA i nie wymaga żadnych dodatkowych działań.
public AdEvent.AdEventListener buildAdEventListener() { logText = findViewById(R.id.logText); logText.setMovementMethod(new ScrollingMovementMethod()); return event -> { AdEvent.AdEventType eventType = event.getType(); if (eventType == AdEvent.AdEventType.AD_PROGRESS) { return; } String log = "IMA event: " + eventType; if (logText != null) { logText.append(log + "\n"); } Log.i(LOG_TAG, log); }; }
Utwórz metodę pomocniczą getImaSdkSettings()
, która zwraca obiekt ImaSdkSettings
, aby skonfigurować dowolne ustawienia pakietu IMA SDK:
private ImaSdkSettings getImaSdkSettings() { if (imaSdkSettings == null) { imaSdkSettings = ImaSdkFactory.getInstance().createImaSdkSettings(); // Set any IMA SDK settings here. } return imaSdkSettings; }
6. Inicjowanie i zwalnianie odtwarzacza
Dodaj metody zwalniania i inicjowania odtwarzacza. W metodzie initializePlayer()
utwórz ExoPlayer
. Następnie utwórz element AdsMediaSource
i ustaw go w odtwarzaczu:
private void releasePlayer() { adsLoader.setPlayer(null); playerView.setPlayer(null); player.release(); player = null; } private void initializePlayer() { // Set up the factory for media sources, passing the ads loader and ad view providers. DataSource.Factory dataSourceFactory = new DefaultDataSource.Factory(this); MediaSource.Factory mediaSourceFactory = new DefaultMediaSourceFactory(dataSourceFactory) .setLocalAdInsertionComponents(unusedAdTagUri -> adsLoader, playerView); // 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); // Create the MediaItem to play, specifying the content URI and ad tag URI. Uri contentUri = Uri.parse(SAMPLE_VIDEO_URL); Uri adTagUri = Uri.parse(SAMPLE_VAST_TAG_URL); MediaItem mediaItem = new MediaItem.Builder() .setUri(contentUri) .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build(); // Prepare the content and ad to be played with the SimpleExoPlayer. player.setMediaItem(mediaItem); player.prepare(); // Set PlayWhenReady. If true, content and ads will autoplay. player.setPlayWhenReady(false); }
7. Obsługa zdarzeń odtwarzacza
Na koniec utwórz wywołania zwrotne dla zdarzeń cyklu życia odtwarzacza:
onStart
onResume
onStop
onPause
onDestroy
@Override public void onStart() { super.onStart(); if (SDK_INT > 23) { initializePlayer(); if (playerView != null) { playerView.onResume(); } } } @Override public void onResume() { super.onResume(); if (SDK_INT <= 23 || player == null) { initializePlayer(); if (playerView != null) { playerView.onResume(); } } } @Override public void onPause() { super.onPause(); if (SDK_INT <= 23) { if (playerView != null) { playerView.onPause(); } releasePlayer(); } } @Override public void onStop() { super.onStop(); if (SDK_INT > 23) { if (playerView != null) { playerView.onPause(); } releasePlayer(); } } @Override protected void onDestroy() { adsLoader.release(); super.onDestroy(); }
Teraz możesz wysyłać żądania reklam i wyświetlać je za pomocą pakietu IMA SDK. Aby dowiedzieć się więcej o zaawansowanych funkcjach, zapoznaj się z innymi przewodnikami lub przykładami na GitHubie.