【发布时间】:2020-03-11 11:05:47
【问题描述】:
我在 Play 商店中有一款不错的应用,有几千名用户,而且我已经使用 AdMob 插页式广告和横幅广告几年了。最近我注意到在某些设备上广告永远不会加载。
我已经检查了所有内容,而且这几天我一直在摸不着头脑。在这些设备上,AdMob 已初始化,但插页式广告和横幅永远不会加载。
MobileAds.initialize( this, (InitializationStatus initializationStatus) -> {
Log.d( TAG, "initAds: " + initializationStatus );
loadInterstitialAd();
//loadRewardedVideoAd();
} );
以上返回 com.google.android.gms.internal.ads.zzahg@xxxxxx
有类似经历的朋友吗?
每次我尝试展示广告时,插页式广告的状态都是“加载中”。这可能发生在我所有客户端设备的大约 10-15% 和我的一个带有 Android API 22 的模拟器上。
我还检查了我的日志,可以说这些设备与 Android 8,9 和 10 以及三星、LGE、摩托罗拉和谷歌的设备不同。
我什至尝试过使用测试广告单元 ID。结果是一样的。
更新->代码
private void loadInterstitialAd() {
if (mInterstitialAd == null) {
mInterstitialAd = new InterstitialAd( MainActivity.this );
mInterstitialAd.setAdUnitId( ADMOB_INTERSTITIAL );//REAL
}
List<String> testDevices = new ArrayList<>();
testDevices.add(AdRequest.DEVICE_ID_EMULATOR);
testDevices.add( ADMOB_TEST_DEVICE_1 );
testDevices.add( ADMOB_TEST_DEVICE_2 );
RequestConfiguration requestConfiguration
= new RequestConfiguration.Builder()
.setTestDeviceIds(testDevices)
.build();
MobileAds.setRequestConfiguration(requestConfiguration);
final AdRequest request = new AdRequest.Builder()
.build();
mInterstitialAd.loadAd( request );
mInterstitialAd.setAdListener( new AdListener() {
@Override
public void onAdClosed() {
//Log.d( TAG, "onAdClosed: Before" );
new Handler().postDelayed( () -> EventBus.getDefault().post( new MessageEvent( EVENT_MESSAGE_ADMOB, EVENT_ACTION_AD_FINISHED, new Bundle() ) ), 200 );
//Log.d( TAG, "onAdClosed: After" );s
mInterstitialAd.loadAd( request );
}
@Override
public void onAdFailedToLoad(int errorCode) {
if (!mInterstitialAd.isLoading()) {
mInterstitialAd.loadAd( request );
}
Log.d( TAG, "onAdFailedToLoad: " + errorCode );
}
@Override
public void onAdLoaded() {
Log.d( TAG, "onAdLoaded: " );
super.onAdLoaded();
}
} );
Log.d( TAG, "loadInterstitialAd: 4 " + (mInterstitialAd == null ? "NULL" : "NOT NULL") );
}
public void showInterstitial() {
Log.d( TAG, "showInterstitial: 0" );
try {
if (mInterstitialAd != null && mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
Log.d( TAG, "showInterstitial: 1" );
} else {
EventBus.getDefault().post( new MessageEvent( EVENT_MESSAGE_ADMOB, EVENT_ACTION_AD_FINISHED, new Bundle() ) );
loadInterstitialAd();
Log.d( TAG, "showInterstitial: 2" );
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences( mContext ).edit();
editor.putLong( "mLastAdShownTime" + appSuffix, 0 );
editor.commit();
}
if (mInterstitialAd.isLoading()) {
Log.d( TAG, "showInterstitial: LOADING" );
Crashlytics.log( TAG + " -showInterstitial - " + getAccountID( mContext ) );
Crashlytics.logException( new RuntimeException() );
}
} catch (Exception e) {
Log.d( TAG, "showInterstitial: 3" );
Crashlytics.log( TAG + " -showInterstitial - " + e.toString() );
Crashlytics.logException( e );
EventBus.getDefault().post( new MessageEvent( EVENT_MESSAGE_ADMOB, EVENT_ACTION_AD_FINISHED, new Bundle() ) );
e.printStackTrace();
loadInterstitialAd();
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences( mContext ).edit();
editor.putLong( "mLastAdShownTime" + appSuffix, 0 );
editor.commit();
}
}
【问题讨论】:
-
能否分享加载广告和展示广告的详细代码sn-ps。
-
嗨 Daxesh,我已经用我的加载和显示代码更新了线程。感谢您的帮助。
-
是某些设备的问题吧?
-
请从 onAdFailedToLoad() 中删除加载广告,因为强烈建议不要尝试从 onAdFailedToLoad() 方法加载新广告。如果您必须从 onAdFailedToLoad() 加载广告,请限制广告加载重试次数,以避免在网络连接受限等情况下不断失败的广告请求。
-
在代码中,您设置了实时广告 id 并设置了 2 个测试设备。但如果测试设备 id 与代码不匹配,那么在测试应用时设置测试插页式 id 效果会更好。
标签: android admob interstitial