我正在尝试使用 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)
}
}
})
}