【问题标题】:Google Play Service Ads (AdMob) shows blank box until readyGoogle Play 服务广告 (AdMob) 显示空白框,直到准备就绪
【发布时间】:2023-03-30 22:16:01
【问题描述】:

我使用 GPS 在我的应用程序中提供广告,但是在加载广告之前以及当用户无法访问 Internet 并且看起来很糟糕时,都会出现空白框。这是我认为从专用 AdMob SDK(已弃用)迁移时 GPS SDK 中的行为发生了变化。

我尝试了 onAdLoaded 的设置侦听器,它将可见性设置为加载后可见,我在创建后设置,但存在一个严重的问题。这不会在应用程序启动时显示空白框并在加载后显示广告。但是在无法上网的情况下,onAdLoaded 不会因为隐藏广告而随时触发!同时返回这些日志:
广告不可见。不刷新广告。
计划从现在起 60000 毫秒后刷新广告。

在这种情况下,用户永远看不到广告...如何防止 GPS 广告这样做?
我的代码放在主要活动中:

        adView = new AdView(this);
        adView.setAdListener(new AdListener() {
            @Override
              public void onAdLoaded() {
                  adView.setVisibility(View.VISIBLE);
                  super.onAdLoaded();
              }
        });
        adView.setVisibility(View.GONE);
        adView.setAdUnitId("xxx");
        adView.setAdSize(AdSize.SMART_BANNER);

        layout = super.root;
        layout.addView(adView);
        adRequest = new AdRequest.Builder().build();

        adView.loadAd(adRequest);

【问题讨论】:

    标签: android cordova admob google-play-services


    【解决方案1】:

    您可以设置一个 BroadcastReceiver 监听 android.net.conn.CONNECTIVITY_CHANGE

    当您再次建立网络连接时,您可以让您的广告可见。

    或者您可以做我们其他人所做的事情,而不必担心 AdView 偶尔会出现空白。

    【讨论】:

    • 但是我还没有看到显示空白广告框的应用程序。广告框将直接与广告一起出现。这肯定是好的做法吗?
    • 通常情况下,当广告无法投放时,前一个广告将继续展示。如果您的第一个广告请求没有收到广告,那么您最终可能会得到一个空白的 AdView。真的没什么好担心的。
    【解决方案2】:

    我们能做的最简单的事情就是什么都不做……但是结果很丑,空白的盒子不性感。

    一切都会改变,如果我们将“可见”的 adView 放入隐藏的容器中,情况也是一样的,AdMob 会识别出 adView 实际上是不可见的,所以 'Ad 是不可见的。不刷新广告。因此容器是多余的。

    解决方案相对较长,包括在 onAdFailedToLoad 触发后重新创建 adView,直到加载第一个广告。我的解决方案源自 Dan Dragut 发布的 here 的好解决方案,我删除了容器,使代码稍微短一些,并且与 cordova 兼容。我确实将非固定方向与 smart_banner 尺寸一起使用,因此需要处理 onOrientationChange 事件(并重新创建 adView)。所以这里是:

    public class example extends DroidGap
    {
        private Ad ad; // new ad class because of code size
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            // Set by <content src="index.html" /> in config.xml
            super.loadUrl(Config.getStartUrl());
            appView.getSettings().setRenderPriority(RenderPriority.HIGH);
            ad = new Ad(this, super.root);
        }
    
        @Override
        public void onConfigurationChanged(Configuration myConfig) {
            super.onConfigurationChanged(myConfig);
            ad.restart();
        }
    
        @Override
        public void onPause() {
            ad.pause();
            super.onPause();
        }
    
        @Override
        public void onResume() {
            super.onResume();
            ad.resume();
        }
    
        private class Ad {
            private DroidGap mGap;
            private AdView adView;
            private LinearLayout layout;
            private AdRequest adRequest;
            private Handler handler = new Handler();
    
            public Ad(DroidGap _mGap, LinearLayout _layout) {
                mGap = _mGap;
                layout = _layout;
                adRequest = new AdRequest.Builder().build();
                recreate();
            }
    
            public void restart() {
                handler.removeCallbacksAndMessages(null);
                layout.removeView(adView);
                adView.destroy();
                this.recreate();
            }
    
            public void pause() {
                adView.pause();
            }
    
            public void resume() {
                adView.resume();
            }
    
            private void recreate() {
                adView = new AdView(mGap);
                adView.setAdListener(new AdListener() {
                    @Override
                    public void onAdLoaded() {
                        adView.setVisibility(View.VISIBLE);
                    }
                    @Override
                    public void onAdFailedToLoad(int errorCode) {
                        //Log.e(TAG, String.format("onAdFailedToLoad(%s)", errorCode));
    
                    // Refresh it ourselves...
                    handler.removeCallbacksAndMessages(null);
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                restart();
                            }
                        }, 30000); // delay of recreating ad
    
                    }
                });
                adView.setVisibility(View.GONE);
                adView.setAdUnitId("xxx");
                adView.setAdSize(AdSize.SMART_BANNER);
                // Lookup your LinearLayout assuming it's been given
                // the attribute android:id="@+id/mainLayout".
                // Add the adView to it.
                layout.addView(adView);
                // Initiate a generic request.
                // Load the adView with the ad request.
                adView.loadAd(adRequest);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多