IMA v3.30.0 以前では、IMA SDK は広告再生ロジックをすべて処理できます。 アプリはコンテンツ動画の再生に重点を置いています。この手法は 「SDK 所有の広告再生」です。
動画プレーヤーで広告を再生する場合、SDK は がそのインターフェースを提供します。Google では、このアプローチを「カスタム 広告の再生」以降のセクションではその実装について説明します。
前提条件
- 基本的な IMA 統合
詳しくは、 高度な例 基本的な IMA がない場合は、まず GitHub で公開してください 統合されていますこの例には、カスタム広告再生がすでに実装されています。余り カスタム広告再生に必要な機能について説明します。 。
VideoAdPlayer とのインターフェース
カスタム広告再生には、アプリに
VideoAdPlayer
行うことができます。このインターフェースは、SDK が広告を再生するようアプリに通知するために使用されます。
できます。アプリはこのインターフェースを使用して、主要な動画広告を SDK に通知します。
できます。インターフェースを実装する手順は次のとおりです。
VideoAdPlayer を作成する
まず、匿名の VideoAdPlayer
クラスを作成します。
requestAds()
内:
private VideoAdPlayer videoAdPlayer;
...
private void requestAds(String adTagUrl) {
videoAdPlayer = new VideoAdPlayer() {
};
}
動画メソッドを追加する
次に、動画プレーヤーに広告を再生、読み込み、停止、一時停止するよう指示するメソッドを追加します。 できます。また、プレーヤーを解放して音量を取得するメソッドも追加します。
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();
}
};
これらのメソッドは、動画プレーヤー独自の類似イベントのシンラッパーです。 あります。なお、これらのメソッドは、Terraform の構成に使用される内部変数を 広告が表示されたかどうかを追跡できますカスタム広告再生では 動画プレーヤーはコンテンツ動画広告と動画広告の両方を再生するため、 表示中のトラックを選択します
広告の再生状況
VideoAdPlayer
インターフェースは別のインターフェースを実装します。
AdProgressProvider
なので、これも実装する必要があります。含まれているのは、
getAdProgress()
は、SDK でこれを使用して
広告の再生情報を提供します。匿名のVideoAdPlayer
に追加する
他のメソッドの下にあります。
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()
は VideoProgressUpdate
型を返します。
動画の現在の位置と再生時間で構成されている必要があります。プレーヤーが
広告が再生されていない場合や再生時間を取得できない場合は、
VideoProgressUpdate.VIDEO_TIME_NOT_READY
を使用します。
動画コールバックを管理する
カスタム広告再生では、アプリが SDK にメジャー
表示されます。SDK の観点から見ると、これらは Google による
VideoAdPlayer.VideoAdPlayerCallback
インターフェースによって記述されます。
コールバック メソッドそのものを使用する前に、
SDK のリクエストに応じてコールバックを追加または削除できることを確認します。これは、
addCallback()
と removeCallback()
を使用して VideoAdPlayer
内で行います。
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);
}
};
この実装では、呼び出すコールバックに List<>
を使用します。
List<>.add()
メソッドと remove()
メソッド。
コールバックを呼び出す
SDK がアプリにコールバックの追加と削除を指示できるようになったので、 コールバックが呼び出される場所を定義します。アプリは 再生や一時停止など、動画に関する主要なイベントが発生したときに または、動画の終了時やエラー発生時。
そのためには、SampleVideoPlayer
を展開して、これらのイベントに対するリスナーを設定します。
VideoFragment
から追加された動画イベント。これを行うのは、
これらの広告コールバックを呼び出す SampleVideoPlayer
の個別のリスナー
これは、SampleVideoPlayer
は広告について何も知らないためです。
そのため、動画イベントを広告に対応可能なものに転送する必要があります。
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);
}
開始、一時停止、再開
新しい列挙型を作成して再生状態を追跡し、新しいオーバーライドを追加する
SampleVideoPlayer
の start()
メソッドと pause()
メソッドの場合:
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();
}
}
エラーを処理する
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;
}
リスナーを実装する
VideoFragment
に戻って匿名の OnVideoEventsListener
を追加
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();
}
}
}
});
OnVideoCompletedListener
の onVideoCompleted()
メソッドを変更する
処理するにはどうすればよいでしょうか
public void onVideoCompleted() {
// Handle completed event for playing post-rolls.
if (isAdDisplayed) {
for (VideoAdPlayerCallback callback : adCallbacks) {
callback.onEnded();
}
} else {
if (adsLoader != null) {
adsLoader.contentComplete();
}
}
コンテンツと広告を切り替える
この例では、動画プレーヤーの同じインスタンスを使用して、 そのため、広告スペースを切り替えるためのロジックを 表示する必要があります次に、コンテンツを再読み込みして 広告を再生した時点まで戻ります。2 つ足す 使用できます。
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;
}
これらは、CONTENT_PAUSE_REQUESTED
と
CONTENT_RESUME_REQUESTED
件のイベントを
それぞれ VideoFragment.onAdEvent()
になります。
case CONTENT_PAUSE_REQUESTED:
pauseContent();
break;
case CONTENT_RESUME_REQUESTED:
resumeContent();
break;
カスタム広告再生を有効にする
最後のステップとして、カスタムの広告再生を使用していることを SDK に伝えます。
そのためには、VideoAdPlayer
を AdDisplayContainer
に渡します。
adDisplayContainer.setPlayer(videoAdPlayer);
プレーヤーを setPlayer()
に渡す必要があります。それ以外の場合、
SDK は SDK が所有する再生を使用します。
以上です。カスタム広告再生を IMA の実装。独自の実装を 高度な例 GitHub で確認してください