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을 만듭니다.
(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();
}
}
콘텐츠와 광고 간 전환
이 예에서는 동일한 동영상 플레이어 인스턴스를 사용하여 콘텐츠와 광고 간에 전환할 수 있는 로직을 추가해야 합니다. 사용할 수 있습니다. 그런 다음 광고가 시작된 지점으로 돌아가면 됩니다. 두 개 더하기 함수를 사용하여 이를 수행할 수 있습니다.
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 소유 재생을 사용합니다.
이상입니다. 지금까지 모바일 기기에 맞춤 광고 재생을 추가하는 데 필요한 구현할 수 있습니다. 자체 구현과 고급 예 를 찾아보실 수 있습니다.