IMA SDK for Android を使用したカスタム広告再生

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

開始、一時停止、再開

新しい列挙型を作成して再生状態を追跡し、新しいオーバーライドを追加する SampleVideoPlayerstart() メソッドと 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();
            }
        }
    }
});

OnVideoCompletedListeneronVideoCompleted() メソッドを変更する 処理するにはどうすればよいでしょうか

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_REQUESTEDCONTENT_RESUME_REQUESTED 件のイベントを それぞれ VideoFragment.onAdEvent() になります。

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

カスタム広告再生を有効にする

最後のステップとして、カスタムの広告再生を使用していることを SDK に伝えます。 そのためには、VideoAdPlayerAdDisplayContainer に渡します。

adDisplayContainer.setPlayer(videoAdPlayer);

プレーヤーを setPlayer() に渡す必要があります。それ以外の場合、 SDK は SDK が所有する再生を使用します。

以上です。カスタム広告再生を IMA の実装。独自の実装を 高度な例 GitHub で確認してください