Android용 IMA SDK를 사용한 맞춤 광고 재생

IMA v3.30.0 이하에서는 IMA SDK가 모든 광고 재생 로직을 처리할 수 있으므로 앱 콘텐츠 동영상 재생에 초점을 맞춰야 합니다 이 접근 방식을 'SDK 소유 광고 재생'을 참조하세요.

동영상 플레이어에서 광고를 재생하려는 경우 SDK는 이를 위한 인터페이스를 제공합니다. 이러한 접근 방식을 '커스텀 학습'이라고 '광고 재생' 이 가이드의 나머지 부분에서는 구현 방법을 설명합니다.

기본 요건

  • 기본 IMA 통합

자세한 내용은 고급 예 를 참고하시기 바랍니다. 통합할 수 있습니다 이 예에서는 이미 맞춤 광고 재생을 구현하고 있습니다. 나머지는 맞춤 광고 재생에 필요한 기능을 사용할 수 있습니다.

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

이러한 메서드는 동영상 플레이어의 유사한 메서드를 참조하세요. 이러한 메서드는 광고 게재 여부를 추적할 수 있습니다. 맞춤 광고 재생에서 동영상 플레이어는 콘텐츠 동영상 및 동영상 광고를 모두 재생하므로 확인할 수 있습니다.

광고 재생 진행률

VideoAdPlayer 인터페이스는 AdProgressProvider이므로 이것도 구현해야 합니다. 여기에는 한 가지 메서드인 getAdProgress()는 광고에 대한 재생 정보 익명의 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의 뷰에서 보면 다음과 같을 때 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에서 추가된 동영상 이벤트입니다. API를 만드는 이유는 이러한 광고 콜백을 호출하는 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);
}

시작, 일시중지, 다시 시작

재생 상태를 추적하고 새 재정의를 추가하는 새 enum을 만듭니다. (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();
    }
}

콘텐츠와 광고 간 전환

이 예에서는 동일한 동영상 플레이어 인스턴스를 사용하여 콘텐츠와 광고 간에 전환할 수 있는 로직을 추가해야 합니다. 사용할 수 있습니다. 그런 다음 광고가 시작된 지점으로 돌아가면 됩니다. 두 개 더하기 함수를 사용하여 이를 수행할 수 있습니다.

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에 알리는 것입니다. VideoAdPlayerAdDisplayContainer에 전달하면 됩니다.

adDisplayContainer.setPlayer(videoAdPlayer);

플레이어를 setPlayer()에 전달해야 합니다. 그렇지 않으면 SDK가 SDK 소유 재생을 사용합니다.

이상입니다. 지금까지 모바일 기기에 맞춤 광고 재생을 추가하는 데 필요한 구현할 수 있습니다. 자체 구현과 고급 예 를 찾아보실 수 있습니다.