1

我将 IMA SDK 添加到我的项目中以播放 VAST 广告。我发现了一个奇怪的问题 - 经过 10-15 分钟的会话onAdError(AdErrorEvent adErrorEvent)并且onAdEvent(AdEvent adEvent)没有被调用。因此,如果我运行我的应用程序并从列表中选择一个视频文件,我会看到广告,并且当广告完成时视频开始播放。在这种情况下onAdEvent(AdEvent adEvent)称为 ( ALL_ADS_COMPLETED)。如果我选择下一个视频,服务器会返回空的 VAST XML,onAdError(AdErrorEvent adErrorEvent)调用它,然后启动另一个视频。10-15 分钟后,如果我从列表中选择一个视频,这两个事件都没有被调用,也没有任何反应,因为我的播放器开始从这些事件的列表中播放视频。

BasicExample项目中的所有代码。

源代码:

        OnCreate() {
             mSdkFactory = ImaSdkFactory.getInstance();
             mAdsLoader = mSdkFactory.createAdsLoader(this);
             mAdUiContainer = (ViewGroup) findViewById(R.id.videoPlayerWithAdPlayback);

             mAdsLoader.addAdErrorListener(this);
             mAdsLoader.addAdsLoadedListener(new AdsLoadedListener() {
             @Override
             public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {
             // Ads were successfully loaded, so get the AdsManager instance. AdsManager has
             // events for ad playback and errors.
                mAdsManager = adsManagerLoadedEvent.getAdsManager();

             // Attach event and error event listeners.
                mAdsManager.addAdErrorListener(MainActivity.this);
                mAdsManager.addAdEventListener(MainActivity.this);
                mAdsManager.init();
              }
             });
            }

            @Override
            public void onAdEvent(AdEvent adEvent) {
            Log.i(LOGTAG, "Event: " + adEvent.getType());

            // These are the suggested event types to handle. For full list of all ad event
           // types, see the documentation for AdEvent.AdEventType.
           switch (adEvent.getType()) {
                case LOADED:
                                    // AdEventType.LOADED will be fired when ads are ready to be played.
                                    // AdsManager.start() begins ad playback. This method is ignored for VMAP or
                                    // ad rules playlists, as the SDK will automatically start executing the
                                    // playlist.
                   mAdsManager.start();
                   break;
                case CONTENT_PAUSE_REQUESTED:
                                    // AdEventType.CONTENT_PAUSE_REQUESTED is fired immediately before a video
                                    // ad is played.
                   mIsAdDisplayed = true;
                   mVideoPlayer.pause();
                   break;
                case CONTENT_RESUME_REQUESTED:
                                    // AdEventType.CONTENT_RESUME_REQUESTED is fired when the ad is completed
                                    // and you should start playing your content.
                   mIsAdDisplayed = false;
                   mVideoPlayer.play();
                   break;
                case ALL_ADS_COMPLETED:
                   mIsAdDisplayed = true;
                   if (mAdsManager != null) {
                         mAdsManager.destroy();
                         mAdsManager = null;
                   }
                   mVideoPlayer.play();
                   break;
                   default:
                   break;
                       }
                   }

        @Override
        public void onAdError(AdErrorEvent adErrorEvent) {
            Log.e(LOGTAG, "Ad Error: " + adErrorEvent.getError().getMessage());
                            mVideoPlayer.play();
                        }

        private void requestAds(String adTagUrl) {

             AdDisplayContainer adDisplayContainer = mSdkFactory.createAdDisplayContainer();
             adDisplayContainer.setAdContainer(mAdUiContainer);

             // Create the ads request.
             AdsRequest request = mSdkFactory.createAdsRequest();
             request.setAdTagUrl(adTagUrl);
             appendLog("VAST Tag: " + adTagUrl);
             request.setAdDisplayContainer(adDisplayContainer);
             request.setContentProgressProvider(new ContentProgressProvider() {
             @Override
             public VideoProgressUpdate getContentProgress() {
                  if (mIsVastAdDisplayed || exoPlayer == null || exoPlayer.getDuration() <= 0) {
                  return VideoProgressUpdate.VIDEO_TIME_NOT_READY;
                                }
                  return new VideoProgressUpdate(exoPlayer.getCurrentPosition(),
                                        exoPlayer.getDuration());
                            }
                        });

                        // Request the ad. After the ad is loaded, onAdsManagerLoaded() will be called.
                  mAdsLoader.requestAds(request);

    }

依赖项:

    implementation 'com.google.ads.interactivemedia.v3:interactivemedia:3.10.6'
    implementation 'com.google.android.gms:play-services-ads-identifier:16.0.0'
<string name="ad_tag_url"><![CDATA[https://pubads.g.doubleclick.net/gampad/ads?sz=640x480&iu=/124319096/external/single_ad_samples&ciu_szs=300x250&impl=s&gdfp_req=1&env=vp&output=vast&unviewed_position_start=1&cust_params=deployment%3Ddevsite%26sample_ct%3Dskippablelinear&correlator=]]></string>
4

0 回答 0