Google Play 服务广告 (AdMob) 会显示空白框,直到准备就绪



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

我尝试了 onAdLoad 的设置侦听器,它将可见性设置为在创建后设置的加载后可见,但存在一个严重的问题。这不会在应用程序启动时显示空白框,也不会在加载后显示广告。但是,当无法访问互联网时,由于隐藏的广告,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.net.conn.CONNECTIVITY_CHANGE的广播接收器

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

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

我们能做的最简单的事情就是什么都不做...但结果是丑陋的,空白框并不性感。

一切都会改变,如果我们将"可见"adView 放入隐藏容器中,情况是一样的,AdMob 会认识到 adView 实际上不可见,因此"广告不可见"。不刷新广告。 因此容器是超浮的。

该解决方案相对较长,包括在 onAdFailedToLoad 触发后重新创建 adView,直到加载第一个广告。我的解决方案源自 Dan Dragut 在此处发布的不错的解决方案,我删除了包含器,使代码略短,并使其与 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);
        }
    }
}

最新更新