【问题标题】:google loads native ad banner only once谷歌只加载一次原生广告横幅
【发布时间】:2019-09-10 11:32:51
【问题描述】:

我正在 android 上实现谷歌原生广告。我从 this example 复制/粘贴的大部分代码 唯一的区别是我请求的是一堆广告而不是一个广告。这里是加载函数:

  public void loadAds(String unitId,int count) {
        if (nativeAds.size()>0) {
            for(UnifiedNativeAd ad: nativeAds)
                ad.destroy();
        }
        nativeAds =new ArrayList();
        //load
        AdLoader.Builder builder = new AdLoader.Builder(context, unitId);

        builder.forUnifiedNativeAd(new UnifiedNativeAd.OnUnifiedNativeAdLoadedListener() {
            // OnUnifiedNativeAdLoadedListener implementation.
            @Override
            public void onUnifiedNativeAdLoaded(UnifiedNativeAd nativeAd) {
                // You must call destroy on old ads when you are done with them,
                // otherwise you will have a memory leak.
                //nativeAd = unifiedNativeAd;
                int numAds =nativeAds.size();
                int insertTo=numAds==0? firstAdPosition : firstAdPosition +numAds*(AdStep +1);
                CategoryData item = new CategoryData();
                item.type = ItemData.TYPE_CATEGORIES_NATIVE_AD;
                if (insertTo<data.size())
                    data.add(insertTo, item);

                item = new CategoryData();
                item.type = ItemData.TYPE_CATEGORIES_SEPARATOR;
                if (insertTo<data.size())
                data.add(insertTo+1, item);

                nativeAds.add(nativeAd);
                Log.d("nativead","got ad body "+nativeAds.size()+":"+nativeAd.getBody());
                notifyItemRangeInserted(insertTo,2);
            }

        });

        VideoOptions videoOptions = new VideoOptions.Builder()
                .setStartMuted(true)
                .build();

        NativeAdOptions adOptions = new NativeAdOptions.Builder()
                .setVideoOptions(videoOptions)
                .build();

        builder.withNativeAdOptions(adOptions);

        AdLoader adLoader = builder.withAdListener(new AdListener() {
            @Override
            public void onAdFailedToLoad(int errorCode) {
                Log.d("nativead","error code " +errorCode);
                /*
                Toast.makeText(context, "Failed to load native ad: "
                        + errorCode, Toast.LENGTH_SHORT).show();
                 */
            }
        }).build();
        AdRequest adRequest;
       // get unpersonalized ads if needed
        if(AppModel.getAppData().gdpr.eea && AppModel.getAppData().gdpr.consentStatus!= ConsentStatus.PERSONALIZED) {
            Bundle extras = new Bundle();
            extras.putString("npa", "1");
            adRequest = new AdRequest.Builder().addNetworkExtrasBundle(AdMobAdapter.class,extras).build();
        } else {
            adRequest = new AdRequest.Builder().build();
        }
        adLoader.loadAds(adRequest,count);
        //adLoader.loadAd(adRequest);
    }

第一次加载正常,但如果我重新启动应用程序会引发一堆错误:

I/Ads:收到日志消息:广告请求返回特定广告位的无填充信息。下面的错误日志显示“格式错误的原生 JSON 响应”是一个良性警告,将在未来的 SDK 版本中删除。

错误代码 0 也被传递到 onAdFailedToLoad。如果我清除应用程序的数据横幅会再次加载,但仅适用于单次运行

【问题讨论】:

  • 您是否使用测试广告来加载广告?如果不是,请考虑使用测试广告,因为它们的填充率更高。
  • 不,我正在测试生活广告单元。使用测试槽不会出现问题

标签: android admob native-ads


【解决方案1】:

正如您所提到的,在上面的评论中,您是在真实的广告单元上测试它(这非常危险,因为您可能会因此而被屏蔽)。

您得到的是 NO_FILL,这意味着在 AdMob 后端中没有剩余的广告资源可供投放。

您可以在here了解更多关于这个问题(不是问题,我们可以称之为“事物”)。

要获得正确的结果,请始终使用测试广告进行测试,以便在测试时获得广告的最大填充率。

您可以在 this page 上找到测试广告的广告单元 ID。

而且,如果您在制作过程中仍然经常遇到 NO_FILL 错误,请尝试使用中介从多个广告来源获取广告。但是,您永远不会获得 100% 的广告填充率,因此请确保您相应地编写代码以处理 NO_FILL

另外,还有一点提醒,不要使用实时广告来测试应用,你可能会因为这样做而被 Admob/Google 屏蔽。

【讨论】:

  • 我正在测试发布版本。我看不出有测试单元 ID 的原因。
  • 即使您在发布版本上进行测试,您自己的帐户也会获得 NO_FILL。一旦更多用户开始请求广告,您的库存将开始填满,并开始为您提供更高的填充率。不要试图“测试”真实的广告,你肯定会被禁止。如果它适用于测试 ID,它将适用于真实的广告,相信我。
  • 确实,我的平板电脑似乎被禁止了。它在我的手机上完美运行。谢谢!
  • 他们不只是禁止您测试广告的设备。如果您测试太多实时广告,他们会禁止您的帐户。使用配置为测试设备的测试广告/设备随心所欲。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多