Android IMA SDK Preloading - UI is not rendering & Events are not getting fired

481 Views Asked by At

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

There are 0 best solutions below