2

我正在尝试使用 IMA SDK for Android 实现预卷广告,MediaPlayer 使用 Android 的 SurfaceView/TextureView 和 MediaPlayer 实现。我遵循了 git link上给出的高级示例

我已将我的视频播放器与 AdsManager 连接起来,如本例中给出的回调。我正在使用 IMA SDK 提供的预加载选项来预加载链接上给出的 VAST 一旦我的init() 广告管理器LOADED在附加的事件侦听器中接收到事件。但在那之后,除了 . 之外没有收到任何事件AD_PROGRESS。此外,不会呈现应该呈现的默认 ui(包含单击按钮和跳过按钮的 web 视图)AdDisplayContainer。我不确定我是否以正确的方式实施。

请帮助我找到我所缺少的或指导我参考以正确实施。附上代码片段以供参考。

我的初始化程序代码是:

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

加载 adsManager 后,我将启用预加载:

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

用 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)
            }
        }
    })
}
4

0 回答 0