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

时间:2014-03-02 17:44:49

标签: android cordova admob google-play-services

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

我尝试了onAdLoaded的set侦听器,它在创建后设置的加载后将可见性设置为可见,但是存在严重的问题。这在应用程序启动时没有显示空白框,并且在加载后显示广告。但是,当无法访问互联网时,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);

2 个答案:

答案 0 :(得分:0)

你可以设置一个侦听android.net.conn.CONNECTIVITY_CHANGE

的BroadcastReceiver

如果再次建立网络连接,则可以展示广告。

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

答案 1 :(得分:0)

我们能做的最简单的事情就是不做任何事......但结果很难看,空白框不性感。

如果我们将“可见”adView放入隐藏容器中,情况会发生变化,AdMob会认识到adView实际上不可见,因此广告不会显示。没有刷新广告。'因此容器是超级的。

解决方案相对较长,包括在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);
        }
    }
}