Pemutaran iklan kustom dengan IMA SDK untuk Android

Di IMA v3.30.0 dan versi yang lebih lama, IMA SDK dapat menangani semua logika pemutaran iklan, sementara aplikasi Anda berfokus pada memutar video konten. Pendekatan ini disebut "Pemutaran iklan milik SDK".

Jika Anda ingin memutar iklan di pemutar video, SDK menyediakan antarmuka untuk itu. Kami menyebut pendekatan ini sebagai pemutaran iklan" dan bagian selanjutnya dalam panduan ini akan membahas penerapannya.

Prasyarat

  • Integrasi IMA dasar.

Sebaiknya lihat Contoh Lanjutan di github sebagai titik awal jika Anda saat ini tidak memiliki IMA dasar integrasi. Contoh ini sudah menerapkan pemutaran iklan kustom. Sisanya dalam panduan ini akan menjelaskan fitur yang diperlukan untuk pemutaran iklan khusus Iklan IMA.

Antarmuka dengan VideoAdPlayer

Pemutaran iklan kustom mengharuskan aplikasi Anda menerapkan VideoAdPlayer dalam antarmuka berbasis web yang sederhana. Antarmuka ini digunakan oleh SDK untuk memberi tahu aplikasi Anda agar memutar iklan video. Aplikasi Anda juga menggunakan antarmuka ini untuk memberi tahu SDK tentang iklan video utama peristiwa. Ikuti langkah-langkah berikut untuk menerapkan antarmuka.

Membuat VideoAdPlayer

Langkah pertama adalah membuat class VideoAdPlayer anonim dalam requestAds():

private VideoAdPlayer videoAdPlayer;
...

private void requestAds(String adTagUrl) {
    videoAdPlayer = new VideoAdPlayer() {
    };
}

Tambahkan metode video

Berikutnya, tambahkan metode yang memberi tahu pemutar video untuk memutar, memuat, menghentikan, dan menjeda iklan video. 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. Perlu diperhatikan bahwa metode ini menetapkan variabel internal yang digunakan untuk melacak apakah iklan ditampilkan. Pada pemutaran iklan kustom, pemutar video memutar video konten dan iklan video, jadi Anda harus yang sedang ditampilkan.

Progres pemutaran iklan

Antarmuka VideoAdPlayer mengimplementasikan antarmuka lain, AdProgressProvider, jadi Anda juga harus menerapkannya. Hanya memiliki satu metode, getAdProgress(), yang digunakan SDK untuk mendapatkan informasi pemutaran untuk iklan. Tambahkan ke 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 pemain tidak memutar iklan, atau durasi tidak tersedia, minta iklan ditampilkan 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. Dari tampilan SDK, ini adalah callback yang yang dijelaskan oleh antarmuka VideoAdPlayer.VideoAdPlayerCallback. Sebelum masuk ke metode callback itu sendiri, Anda harus menambahkan dan menghapus callback atas permintaan SDK. Ini adalah 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);
        }
};

Penerapan ini menggunakan List<> untuk callback yang akan dipanggil metode List<>.add() dan remove().

Memanggil callback

Setelah SDK memiliki cara memberi tahu aplikasi Anda untuk menambahkan dan menghapus callback, menentukan tempat pemanggilan callback. Aplikasi Anda perlu memanggil callback ini saat peristiwa penting terjadi, seperti pemutaran, jeda atau melanjutkan video, atau saat video selesai atau mengalami error.

Untuk melakukannya, luaskan SampleVideoPlayer agar memiliki pemroses untuk ini peristiwa video yang ditambahkan dari VideoFragment. Alasan untuk membuat pemroses terpisah di SampleVideoPlayer untuk memanggil callback iklan ini adalah karena SampleVideoPlayer tidak tahu 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);
}

Memulai, menjeda, dan melanjutkan

Membuat 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:

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();
            }
        }
    }
});

Mengubah metode onVideoCompleted() dari OnVideoCompletedListener untuk menangani kasus saat video iklan sudah 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 keduanya konten dan iklan. Oleh karena itu, Anda perlu menambahkan beberapa logika untuk beralih konten dan iklan pada pemutar Anda. Anda kemudian dapat memuat ulang dan mencari video konten untuk kembali ke titik awal iklan. 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;
}

Ini dipanggil saat CONTENT_PAUSE_REQUESTED dan CONTENT_RESUME_REQUESTED peristiwa diterima, dalam VideoFragment.onAdEvent(), masing-masing:

case CONTENT_PAUSE_REQUESTED:
    pauseContent();
    break;
case CONTENT_RESUME_REQUESTED:
    resumeContent();
    break;

Aktifkan 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 menggunakan pemutaran yang dimiliki SDK.

Selesai. Itulah semua langkah yang diperlukan untuk menambahkan pemutaran iklan kustom ke Penerapan IMA. Anda dapat membandingkan penerapan Anda sendiri dengan Contoh Lanjutan di github jika Anda mengalami masalah.