Cara tercepat dan paling mudah untuk mengintegrasikan IMA SDK untuk Android ke dalam aplikasi Anda adalah dengan membuat SDK menangani semua logika pemutaran iklan, sementara aplikasi Anda berfokus pada pemutaran video konten. Pendekatan ini, yang disebut "pemutaran iklan milik SDK", adalah opsi default dalam Memulai.
Namun, jika Anda juga ingin memutar iklan di pemutar video, SDK menyediakan antarmuka untuk itu. Kami menyebut pendekatan ini sebagai "pemutaran iklan kustom" dan seluruh panduan ini membahas penerapannya.
Prasyarat
- Integrasi IMA dasar.
Sebaiknya lihat Contoh Lanjutan di github sebagai titik awal jika saat ini Anda tidak memiliki integrasi IMA dasar. Contoh ini sudah menerapkan pemutaran iklan kustom. Bagian selanjutnya dari panduan ini akan menjelaskan fitur-fitur yang diperlukan untuk pemutaran iklan kustom dengan iklan IMA.
Antarmuka dengan VideoAdPlayer
Pemutaran iklan kustom mengharuskan aplikasi Anda menerapkan
antarmuka
VideoAdPlayer
. Antarmuka ini digunakan oleh SDK untuk memberi tahu aplikasi Anda agar memutar video
iklan. Aplikasi Anda juga menggunakan antarmuka ini untuk memberi tahu SDK tentang peristiwa iklan video
utama. Ikuti langkah-langkah berikut untuk menerapkan antarmuka.
Membuat VideoAdPlayer
Langkah pertama adalah membuat class VideoAdPlayer
anonim
di requestAds()
:
private VideoAdPlayer videoAdPlayer;
...
private void requestAds(String adTagUrl) {
videoAdPlayer = new VideoAdPlayer() {
};
}
Menambahkan metode video
Selanjutnya, tambahkan metode yang memberi tahu pemutar video untuk memutar, memuat, menghentikan, dan menjeda video iklan. Kami juga menambahkan metode untuk melepaskan pemutar dan mendapatkan volume di sini:
videoAdPlayer = new VideoAdPlayer() {
@Override
public void playAd() {
if (mIsAdDisplayed) {
videoPlayer.resume();
} else {
isAdDisplayed = true;
videoPlayer.play();
}
}
@Override
public void loadAd(String url) {
isAdDisplayed = true;
videoPlayer.setVideoPath(url);
}
@Override
public void stopAd() {
videoPlayer.stopPlayback();
}
@Override
public void pauseAd() {
videoPlayer.pause();
}
@Override
public void release() {
// any clean up that needs to be done
}
@Override
public int getVolume() {
return videoPlayer.getVolume();
}
};
Metode ini adalah wrapper tipis di sekitar metode serupa pada pemutar video Anda. Perhatikan bahwa metode ini menetapkan variabel internal yang digunakan untuk melacak apakah iklan ditampilkan atau tidak. Dalam pemutaran iklan kustom, pemutar video memutar iklan video dan video konten, sehingga Anda perlu melacak iklan yang saat ini ditampilkan.
Progres pemutaran iklan
Antarmuka VideoAdPlayer
mengimplementasikan antarmuka lain,
AdProgressProvider
, jadi Anda juga harus menerapkannya. Ini hanya memiliki
satu metode, getAdProgress()
, yang digunakan oleh SDK untuk mendapatkan
informasi pemutaran iklan. Tambahkan ke class VideoAdPlayer
anonim Anda, di bawah metode lainnya:
VideoAdPlayer videoAdPlayer = new VideoAdPlayer() {
...
@Override
public VideoProgressUpdate getAdProgress() {
if (!isAdDisplayed || videoPlayer.getDuration() <= 0) {
return VideoProgressUpdate.VIDEO_TIME_NOT_READY;
}
return new VideoProgressUpdate(videoPlayer.getCurrentPosition(),
videoPlayer.getDuration());
}
};
getAdProgress()
menampilkan jenis VideoProgressUpdate
, yang
harus terdiri dari posisi dan durasi video saat ini. Jika pemutar
tidak memutar iklan, atau durasi tidak tersedia, minta pemutar menampilkan
VideoProgressUpdate.VIDEO_TIME_NOT_READY
seperti yang ditunjukkan dalam contoh.
Mengelola callback video
Pemutaran iklan kustom mengharuskan aplikasi Anda memberi tahu SDK tentang peristiwa
video besar. Dari tampilan SDK, ini adalah callback yang
dijelaskan oleh antarmuka VideoAdPlayer.VideoAdPlayerCallback
.
Sebelum masuk ke metode callback itu sendiri, Anda harus
dapat menambahkan dan menghapus callback atas permintaan SDK. Hal ini
dilakukan di dalam VideoAdPlayer
menggunakan addCallback()
dan removeCallback()
:
private List<VideoAdPlayerCallback> adCallbacks = new ArrayList<>(1);
VideoAdPlayer videoAdPlayer = new VideoAdPlayer() {
...
@Override
public void addCallback(VideoAdPlayerCallback videoAdPlayerCallback) {
adCallbacks.add(videoAdPlayerCallback);
}
@Override
public void removeCallback(VideoAdPlayerCallback videoAdPlayerCallback) {
adCallbacks.remove(videoAdPlayerCallback);
}
};
Implementasi ini menggunakan List<>
untuk callback yang akan memanggil
metode List<>.add()
dan remove()
.
Memanggil callback
Setelah SDK memiliki cara untuk memberi tahu aplikasi Anda agar menambahkan dan menghapus callback, tentukan tempat pemanggilan callback. Aplikasi Anda perlu memanggil callback ini saat peristiwa video besar terjadi, seperti memutar, menjeda, atau melanjutkan video, atau saat video selesai atau mengalami error.
Untuk melakukannya, luaskan SampleVideoPlayer
agar memiliki pemroses untuk peristiwa video ini yang ditambahkan dari VideoFragment
. Alasan untuk membuat
pemroses terpisah di SampleVideoPlayer
untuk memanggil callback iklan ini
adalah karena SampleVideoPlayer
tidak mengetahui apa pun tentang iklan,
jadi Anda harus meneruskan peristiwa videonya ke sesuatu yang dapat menangani iklan.
public interface OnVideoEventsListener {
void onPlay();
void onResume();
void onPause();
void onError();
}
private final List<OnVideoEventsListener> onVideoEventsListeners = new ArrayList<>(1);
public void addVideoEventsListener(OnVideoEventsListener listener) {
onVideoEventsListeners.add(listener);
}
Mulai, jeda, dan lanjutkan
Buat enum baru untuk melacak status pemutaran dan menambahkan penggantian baru
untuk metode start()
dan pause()
di SampleVideoPlayer
:
private enum PlaybackState {
STOPPED, PAUSED, PLAYING
}
private PlaybackState playbackState = PlaybackState.STOPPED;
@Override
public void start() {
super.start();
switch (playbackState) {
case STOPPED:
for (OnVideoEventsListener listener : onVideoEventsListeners) {
listener.onPlay();
}
break;
case PAUSED:
for (OnVideoEventsListener listener : onVideoEventsListeners) {
listener.onResume();
}
break;
default:
// Already playing; do nothing.
break;
}
playbackState = PlaybackState.PLAYING;
}
@Override
public void pause() {
super.pause();
playbackState = PlaybackState.PAUSED;
for (OnVideoEventsListener listener : onVideoEventsListeners) {
listener.onPause();
}
}
Menangani error
Ganti pemroses error anonim pemutar video yang Anda tetapkan di init()
:
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
playbackState = PlaybackState.STOPPED;
for (OnVideoEventsListener listener : onVideoEventsListeners) {
listener.onError();
}
// Returning true signals to MediaPlayer that the error was handled.
// This prevents the completion handler from being called.
return true;
}
Mengimplementasikan pemroses
Kembali ke VideoFragment
dan tambahkan OnVideoEventsListener
anonim ke instance SampleVideoPlayer
Anda:
mVideoPlayer.addVideoEventsListener(new OnVideoEventsListener() {
@Override
public void onPlay() {
if (isAdDisplayed) {
for (VideoAdPlayerCallback callback : adCallbacks) {
callback.onPlay();
}
}
}
@Override
public void onResume() {
if (isAdDisplayed) {
for (VideoAdPlayerCallback callback : adCallbacks) {
callback.onResume();
}
}
}
@Override
public void onPause() {
if (isAdDisplayed) {
for (VideoAdPlayerCallback callback : adCallbacks) {
callback.onPause();
}
}
}
@Override
public void onError() {
if (isAdDisplayed) {
for (VideoAdPlayerCallback callback : adCallbacks) {
callback.onError();
}
}
}
});
Ubah metode onVideoCompleted()
dari OnVideoCompletedListener
untuk menangani kasus ketika video iklan selesai:
public void onVideoCompleted() {
// Handle completed event for playing post-rolls.
if (isAdDisplayed) {
for (VideoAdPlayerCallback callback : adCallbacks) {
callback.onEnded();
}
} else {
if (adsLoader != null) {
adsLoader.contentComplete();
}
}
Beralih antara konten dan iklan
Contoh ini menggunakan instance pemutar video yang sama untuk memutar konten dan iklan, sehingga Anda perlu menambahkan beberapa logika untuk beralih antara konten dan iklan di pemutar. Kemudian, Anda dapat memuat ulang dan mencari video konten untuk kembali ke titik tempat iklan dimulai. Tambahkan dua fungsi untuk melakukannya:
private int savedContentPosition = 0;
private void pauseContent() {
savedContentPosition = videoPlayer.getCurrentPosition();
videoPlayer.stopPlayback();
isAdDisplayed = true;
}
private void resumeContent() {
videoPlayer.setVideoPath(getString(R.string.content_url));
videoPlayer.seekTo(mSavedContentPosition);
videoPlayer.play();
isAdDisplayed = false;
}
Metode ini dipanggil saat peristiwa CONTENT_PAUSE_REQUESTED
dan
CONTENT_RESUME_REQUESTED
diterima, di
VideoFragment.onAdEvent()
:
case CONTENT_PAUSE_REQUESTED:
pauseContent();
break;
case CONTENT_RESUME_REQUESTED:
resumeContent();
break;
Mengaktifkan pemutaran iklan kustom
Langkah terakhir adalah memberi tahu SDK bahwa Anda menggunakan pemutaran iklan kustom.
Hal ini dilakukan dengan meneruskan VideoAdPlayer
ke AdDisplayContainer
Anda:
adDisplayContainer.setPlayer(videoAdPlayer);
Anda harus meneruskan pemutar ke setPlayer()
. Jika tidak, SDK akan menggunakan pemutaran milik SDK.
Selesai. Itulah semua langkah yang diperlukan untuk menambahkan pemutaran iklan kustom ke penerapan IMA. Anda dapat membandingkan implementasi Anda sendiri dengan Contoh Lanjutan di github jika mengalami masalah.