Android 谷歌播放服务广告(AdMob)显示空白框,直到准备就绪
我使用GPS在我的应用程序中提供广告,但在加载广告之前,以及当用户无法访问互联网时,都会出现空白框,这看起来很糟糕。我认为这是在从专用AdMob SDK(已弃用)迁移的过程中,GPS SDK的行为发生了变化 我尝试了为onAdLoaded设置侦听器,它将可见性设置为在从我在创建之后设置的gone加载之后可见,但存在一个严重的问题。这不是在应用程序启动时显示空白框,而是在加载后显示广告。然而,当无法访问互联网时,onAdLoaded不会因为隐藏的广告而随时被解雇!同时返回这些日志:Android 谷歌播放服务广告(AdMob)显示空白框,直到准备就绪,android,cordova,admob,google-play-services,Android,Cordova,Admob,Google Play Services,我使用GPS在我的应用程序中提供广告,但在加载广告之前,以及当用户无法访问互联网时,都会出现空白框,这看起来很糟糕。我认为这是在从专用AdMob SDK(已弃用)迁移的过程中,GPS SDK的行为发生了变化 我尝试了为onAdLoaded设置侦听器,它将可见性设置为在从我在创建之后设置的gone加载之后可见,但存在一个严重的问题。这不是在应用程序启动时显示空白框,而是在加载后显示广告。然而,当无法访问互联网时,onAdLoaded不会因为隐藏的广告而随时被解雇!同时返回这些日志: 广告不可见。不
广告不可见。不刷新广告。
正在计划从现在起60000毫秒的ad刷新 在这种情况下,用户永远不会看到广告。。。如何防止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);
您可以设置一个BroadcastReceiver,监听android.net.conn.CONNECTIVITY\u更改 当你再次建立网络连接时,你可以看到你的广告
或者你可以做我们其他人做的事,不必担心偶尔出现的空白通知。我们能做的最简单的事情就是什么都不做。。。但结果是丑陋的,空白框不性感 任何事情都会改变,如果我们将“可见”adView放入一个隐藏的容器中,情况是一样的,AdMob认识到adView实际上是不可见的,所以“广告是不可见的”。不刷新广告。因此,容器是超级的 解决方案相对较长,包括在onAdFailedToLoad火灾后重新创建adView,直到加载第一个ad。我的解决方案来源于Dan Dragut发布的漂亮解决方案,我删除了容器,使代码稍微短一点,并使其与cordova兼容。我确实使用了非固定方向和使用smart_横幅大小,因此需要处理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);
}
}
}
公共类示例扩展了DroidGap
{
private Ad;//由于代码大小,新的Ad类
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//在config.xml中设置
super.loadUrl(Config.getStartUrl());
appView.getSettings().setRenderPriority(RenderPriority.HIGH);
ad=新的ad(这个,super.root);
}
@凌驾
公共无效OnConfiguration已更改(配置myConfig){
super.onConfigurationChanged(myConfig);
ad.重新启动();
}
@凌驾
公共无效暂停(){
暂停();
super.onPause();
}
@凌驾
恢复时公开作废(){
super.onResume();
广告恢复();
}
私人类广告{
私人DroidGap-mGap;
私人咨询咨询;
私人线路布局;
私人信件;
私有处理程序=新处理程序();
公共广告(DroidGap、线性布局){
mGap=_mGap;
布局=_布局;
adRequest=新建adRequest.Builder().build();
重新创建();
}
公共无效重新启动(){
handler.removeCallbacksAndMessages(null);
布局。移除视图(adView);
adView.destroy();
这个。重新创建();
}
公共空间暂停(){
暂停;
}
公众简历(){
adView.resume();
}
私有void(){
adView=新adView(mGap);
adView.setAdListener(新的AdListener(){
@凌驾
已加载的公共无效(){
adView.setVisibility(View.VISIBLE);
}
@凌驾
在失败的TOLOAD上公开无效(int错误代码){
//Log.e(TAG,String.format(“onAdFailedToLoad(%s)”,errorCode));
//自己刷新它。。。
handler.removeCallbacksAndMessages(null);
handler.postDelayed(新的Runnable(){
@凌驾
公开募捐{
重启();
}
},30000);//延迟重新创建广告
}
});
adView.setVisibility(View.GONE);
咨询意见集(“xxx”);
adView.setAdSize(AdSize.SMART_BANNER);
//查找线性布局(假设已给定)
//属性android:id=“@+id/mainLayout”。
//将adView添加到其中。
layout.addView(adView);
//启动一个通用请求。
//使用ad请求加载adView。
adView.loadAd(adRequest);
}
}
}
但我还没有看到这个应用程序,它显示了一个空白的广告框。广告框将直接与广告一起出现。这是否是一个好的做法?通常情况下,当一个广告无法送达时,将继续显示上一个广告。如果你的第一个广告请求没有收到广告,那么你可能会得到一个空白的广告视图。这真的没什么可担心的。