I am trying to implement preroll ads with IMA SDK for Android with MediaPlayer implemented with SurfaceView/TextureView & MediaPlayer of Android. I have followed Advanced Example given on git link
I have connected my video player with AdsManager as given in this example with callbacks.
I am using preloading option given with IMA SDK to preload VAST as given on link
Once I init()
ad manager I am receiving event LOADED
in event listener that is attached. but after that no events are received other than AD_PROGRESS
. Also, default ui (webview containing click button & skip button) that should get rendered in AdDisplayContainer
is not rendered. I am not sure if I have implemented in proper way.
Please help me finding what I am missing or guide me towards reference for proper implementation. Attaching code snippet for reference.
My Initializer code is:
fun requestAds(){
videoAdPlayer = object : VideoAdPlayer {
override fun getAdProgress(): VideoProgressUpdate {
return if (myVideoPlayer == null || (myVideoPlayer?.getDuration() ?: 0 <= 0)) {
VideoProgressUpdate.VIDEO_TIME_NOT_READY
} else if (myVideoPlayer != null) {
VideoProgressUpdate(myVideoPlayer!!.getCurrentPosition().toLong(),
myVideoPlayer!!.getDuration().toLong())
} else {
VideoProgressUpdate.VIDEO_TIME_NOT_READY
}
}
override fun getVolume(): Int {
return myVideoPlayer?.getVolume() ?: 0
}
override fun addCallback(p0: VideoAdPlayer.VideoAdPlayerCallback?) {
if (p0 != null) {
videoPlayerCallbacks.add(p0)
}
}
override fun loadAd(adMediaInfo: AdMediaInfo?, adpodInfo: AdPodInfo?) {
if (adMediaInfo != null && !TextUtils.isEmpty(adMediaInfo.url)) {
mCurrentMediaInfo = adMediaInfo
var duration: Int? = null
duration = (mAdsManager?.currentAd?.duration ?: 0).toInt()
adViewLayout.getAdViewController()
?.addMediationUrl(adMediaInfo.url, this@videoController,
duration, -1, mAdsManager?.currentAd?.vastMediaHeight,
mAdsManager?.currentAd?.vastMediaWidth)
}
}
override fun pauseAd(p0: AdMediaInfo?) {
myVideoPlayer?.pauseAd(mIsCalledByDev)
for (callback in videoPlayerCallbacks) {
callback.onPause(p0)
}
}
override fun playAd(p0: AdMediaInfo?) {
val playbackState = myVideoPlayer?.getPlayerState()
if (playbackState == MediaPlayer.STATE_PAUSED) {
myVideoPlayer?.resumeAd(mIsCalledByDev)
for (callback in videoPlayerCallbacks) {
callback.onResume(p0)
}
} else if (playbackState == MediaPlayer.STATE_PREPARED) {
mAdsManager.start()
myVideoPlayer?.startVideo()
for (callback in videoPlayerCallbacks) {
callback.onPlay(p0)
}
}
}
override fun release() {
myVideoPlayer?.release()
}
override fun removeCallback(p0: VideoAdPlayer.VideoAdPlayerCallback?) {
if (p0 != null) {
videoPlayerCallbacks.remove(p0)
}
}
override fun stopAd(p0: AdMediaInfo?) {
myVideoPlayer?.stopAds()
}
}
mAdUiContainer = FrameLayout(mContext)
val mAdDisplayContainer =
ImaSdkFactory.createAdDisplayContainer(mAdUiContainer, videoAdPlayer)
mAdDisplayContainer.player = videoAdPlayer
mSdkFactory = ImaSdkFactory.getInstance()
val request = mSdkFactory!!.createAdsRequest()
request!!.adTagUrl = mAdTagUrl
val imaSdkSettings = mSdkFactory!!.createImaSdkSettings()!!
mAdsLoader =
mSdkFactory?.createAdsLoader(mContext, imaSdkSettings, mAdDisplayContainer!!)
mAdsLoader?.addAdErrorListener(this)
mAdsLoader?.addAdsLoadedListener(this)
// Request the ad. After the ad is loaded, onAdsManagerLoaded() will be called.
mAdsLoader?.requestAds(request)
}
Once adsManager is loaded, I am enabling preloading:
override fun onAdsManagerLoaded(adsManagerLoadedEvent: AdsManagerLoadedEvent?) {
if (adsManagerLoadedEvent?.adsManager != null) {
mAdsManager = adsManagerLoadedEvent.adsManager
if (mAdsManager != null && mSdkFactory != null) {
mAdsManager!!.addAdErrorListener(this)
mAdsManager!!.addAdEventListener(this)
val adsRenderingSettings: AdsRenderingSettings =
mSdkFactory!!.createAdsRenderingSettings()
adsRenderingSettings.enablePreloading = true
adsRenderingSettings.setLoadVideoTimeout(20000)
mAdsManager?.init(adsRenderingSettings)
}
}
}
Connecting my video player with VideoAdPlayerCallback:
fun setVideoPlayer() {
videoPlayer!!.setPlayerCallback(object : VideoPlayer.Callback {
override fun onPrepared() {
}
override fun onStarted() {
if (mCurrentMediaInfo != null) for (callback in videoPlayerCallbacks) {
callback.onPlay(mCurrentMediaInfo)
}
}
override fun onComplete() {
if (mCurrentMediaInfo != null) for (callback in videoPlayerCallbacks) {
callback.onEnded(mCurrentMediaInfo)
}
}
override fun onPaused() {
if (mCurrentMediaInfo != null) for (callback in videoPlayerCallbacks) {
callback.onPause(mCurrentMediaInfo)
}
}
override fun onError() {
if (mCurrentMediaInfo != null) for (callback in videoPlayerCallbacks) {
callback.onError(mCurrentMediaInfo)
}
}
override fun onProgress(totalDuration: Long, progress: Long) {
if (mCurrentMediaInfo != null && videoAdPlayer != null) for (callback in videoPlayerCallbacks) {
callback.onAdProgress(mCurrentMediaInfo, videoAdPlayer!!.adProgress)
}
}
override fun onResumed() {
if (mCurrentMediaInfo != null) for (callback in videoPlayerCallbacks) {
callback.onResume(mCurrentMediaInfo)
}
}
})
}