google 仅加载原生广告横幅一次
google loads native ad banner only once
我在 copy/pasted 来自 this example 的代码 android.Most 上实施 google 原生广告
唯一的区别是我请求一堆广告而不是一个 ad.Here 是加载函数:
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: Received log message: The ad request returned a no fill for the particular slot. The error log below that says 'Malformed native JSON response' is a benign warning that will be removed in a future SDK release.
错误代码 0 也被传递到 onAdFailedToLoad
。如果我清除应用程序的数据横幅将再次加载,但再次仅针对单个 运行
正如您在上面的评论中提到的,您正在真实的广告单元上对其进行测试(这非常危险,因为您可能会因此而被屏蔽)。
您得到 NO_FILL,这意味着 AdMob 后端没有剩余广告资源可供投放。
您可以了解有关此问题的更多信息(不是问题,我们可以称之为 "thing")here。
要获得正确的结果,请始终使用测试广告进行测试,以便在测试时获得广告的最大填充率。
您将在 this page 上找到测试广告的广告单元 ID。
而且,如果您在制作过程中仍然遇到很多 NO_FILL
错误,请尝试使用中介从多个广告来源获取广告。但是,您的广告永远不会获得 100% 的填充率,因此请确保您相应地编写代码以处理 NO_FILL
.
另外,再提醒一下,不要使用实时广告来测试应用程序,这样做可能会被 Admob/Google 屏蔽。
我在 copy/pasted 来自 this example 的代码 android.Most 上实施 google 原生广告 唯一的区别是我请求一堆广告而不是一个 ad.Here 是加载函数:
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: Received log message: The ad request returned a no fill for the particular slot. The error log below that says 'Malformed native JSON response' is a benign warning that will be removed in a future SDK release.
错误代码 0 也被传递到 onAdFailedToLoad
。如果我清除应用程序的数据横幅将再次加载,但再次仅针对单个 运行
正如您在上面的评论中提到的,您正在真实的广告单元上对其进行测试(这非常危险,因为您可能会因此而被屏蔽)。
您得到 NO_FILL,这意味着 AdMob 后端没有剩余广告资源可供投放。
您可以了解有关此问题的更多信息(不是问题,我们可以称之为 "thing")here。
要获得正确的结果,请始终使用测试广告进行测试,以便在测试时获得广告的最大填充率。
您将在 this page 上找到测试广告的广告单元 ID。
而且,如果您在制作过程中仍然遇到很多 NO_FILL
错误,请尝试使用中介从多个广告来源获取广告。但是,您的广告永远不会获得 100% 的填充率,因此请确保您相应地编写代码以处理 NO_FILL
.
另外,再提醒一下,不要使用实时广告来测试应用程序,这样做可能会被 Admob/Google 屏蔽。