Android için IMA SDK ile özel reklam oynatma

IMA 3.30.0 ve önceki sürümlerde, IMA SDK tüm reklam oynatma mantığını ve uygulamanız içerik videosunu oynatmaya odaklanır. Bu yaklaşıma "SDK'ya ait reklam oynatma".

Video oynatıcınızda reklam oynatmak istiyorsanız SDK, bunun için bir arayüz sağlar. Bu yaklaşıma “özel” reklam oynatma" Bu kılavuzun geri kalanında uygulama açıklanmaktadır.

Ön koşullar

  • Temel bir IMA entegrasyonu.

Şunu incelemenizi öneririz: Gelişmiş Örnek temel bir IMA'nız yoksa, başlangıç noktası olarak gitHub'ı inceleyebilirsiniz. Bu örnekte özel reklam oynatma zaten uygulanmaktadır. Kalan Bu kılavuzun amacı, özel reklam oynatma için gereken özellikleri IMA reklamları.

VideoAdPlayer ile arayüz

Özel reklam oynatma için uygulamanızın VideoAdPlayer kullanır. Bu arayüz, SDK tarafından uygulamanıza reklam oynatması için bildirim göndermek amacıyla kullanılır videolar. Uygulamanız, SDK'yı ana video reklam hakkında bilgilendirmek için de bu arayüzü kullanır etkinlikler. Arayüzü uygulamak için aşağıdaki adımları izleyin.

VideoAdPlayer Oluşturma

İlk adım anonim bir VideoAdPlayer sınıfı oluşturmaktır requestAds() içinde:

private VideoAdPlayer videoAdPlayer;
...

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

Video yöntemleri ekleme

Ardından, video oynatıcınıza reklamı oynatmasını, yüklemesini, durdurmasını ve duraklatmasını söyleyen yöntemler ekleyin videolar. Oynatıcıyı serbest bırakma ve ses düzeyini alma yöntemleri de eklenir:

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

Bu yöntemler, video oynatıcınızın kendi benzeri yöntemlerine göz atın. Bu yöntemlerin, bir reklamın gösterilip gösterilmediğini izlemek için Özel reklam oynatmada, video oynatıcı hem içerik videolarını hem de video reklamları oynattığından Şu anda görüntülenen parça.

Reklam oynatma ilerleme durumu

VideoAdPlayer arayüzü, farklı bir arayüz uygular. AdProgressProvider; bu nedenle, onu da uygulamanız gerekir. Yalnızca SDK tarafından kullanılan bir yöntem olan getAdProgress() reklamlar için oynatma bilgileri. Anonim VideoAdPlayer sayfanıza ekleyin aşağıdaki yöntemlerden birini kullanın:

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 türünü döndürür. Videonun mevcut konumundan ve süresinden oluşmalıdır. Oyuncu bir reklamı oynatmıyor ya da süre bilinmiyorsa geri gelmesini sağlayın VideoProgressUpdate.VIDEO_TIME_NOT_READY olarak ayarlanmış olmalıdır.

Görüntülü geri aramaları yönetme

Özel reklam oynatma için uygulamanızın SDK'yı ana makineye bildirmesi gerekir video etkinlikleri oluşturabilirsiniz. SDK'nın görünümünde oluşturulan geri çağırmalar VideoAdPlayer.VideoAdPlayerCallback arayüzünde açıklanmaktadır. Geri çağırma yöntemlerine geçmeden önce SDK'nın isteği üzerine geri çağırma ekleyebilir ve kaldırabilir. Bu VideoAdPlayer içinde addCallback() ve removeCallback() kullanılarak yapıldı:

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

Bu uygulama, çağrılacağı geri çağırmalar için bir List<> kullanır List<>.add() ve remove() yöntemleri.

Geri çağırmaları yapın

Artık SDK, uygulamanıza geri çağırma ekleyip kaldırmasını söyleyebildiğine göre geri çağırmanın çağrıldığı yerleri tanımlayın. Uygulamanızın şu numarayı araması gerekiyor: oynatma, duraklatma, oynatma gibi önemli video etkinlikleri gerçekleştiğinde veya videoyu devam ettirdiğinizde ya da videoda bittiğinde veya hatayla karşılaşıldığında.

Bunu yapmak için SampleVideoPlayer öğesini genişleterek bunların bir işleyicisi olsun VideoFragment kaynağından eklenen video etkinlikleri. Projenin gidişatı boyunca bu reklam geri çağırmalarını adlandırmak için SampleVideoPlayer içinde ayrı bir işleyici SampleVideoPlayer, reklamlar hakkında hiçbir bilgiye sahip olmadığı için Bu nedenle, videonun video etkinliklerini reklamlarla ilgilenebilecek bir yere yönlendirmelisiniz.

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

Başlatma, duraklatma ve devam ettirme

Oynatma durumunu takip etmek ve yeni geçersiz kılmalar eklemek için yeni bir sıralama oluşturun SampleVideoPlayer içindeki start() ve pause() yöntemleri için:

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

Hataları işleme

Video oynatıcının init() içinde ayarladığınız anonim hata işleyicisini geçersiz kılın:

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

İşleyiciyi uygulama

VideoFragment sayfasına dönün ve anonim bir OnVideoEventsListener ekleyin SampleVideoPlayer örneğinize ekleyin:

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 öğesinin onVideoCompleted() yöntemini değiştir reklam videosunun bittiği duruma göre işlem yapılmalıdır:

public void onVideoCompleted() {
    // Handle completed event for playing post-rolls.
    if (isAdDisplayed) {
        for (VideoAdPlayerCallback callback : adCallbacks) {
            callback.onEnded();
        }
    } else {
        if (adsLoader != null) {
            adsLoader.contentComplete();
    }
}

İçerik ve reklamlar arasında geçiş yapma

Bu örnekte, her iki video oynatıcı da oynatılabilir. Bu yüzden, belirli içerik türleri arasında geçiş yapmak için hakkında daha fazla bilgi edineceksiniz. Daha sonra, sayfayı yeniden yükleyip içerik videosunu kullanabilirsiniz. İki tane ekleyin işlevini kullanın:

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

Bunlar, CONTENT_PAUSE_REQUESTED ve Şu aralıkta CONTENT_RESUME_REQUESTED etkinlik alındı: Sırasıyla VideoFragment.onAdEvent():

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

Özel reklam oynatmayı etkinleştirme

Son adım, SDK'ya özel reklam oynatma kullandığınızı bildirmektir. Bu işlem, AdDisplayContainer cihazınıza VideoAdPlayer iletilerek yapılır:

adDisplayContainer.setPlayer(videoAdPlayer);

Oynatıcınızı setPlayer() adlı kullanıcıya vermeniz gerekiyor. Aksi halde, SDK, SDK'ya ait oynatma özelliğini kullanır.

Bu kadar basit. Bunlar, uygulamanıza özel reklam oynatma eklemek için gereken tüm adımlardır. IMA uygulaması. Kendi uygulamanızı Gelişmiş Örnek github'da kontrol edin.