项目场景:
项目中需要接入 google admob sdk 实现广告商业化
问题描述
在接入Institial ad 时,onAdLoaded 成功回调,但是onAdFailedToShowFullScreenContent 也回调了错误信息 “Timeout for show call succeed.”
InterstitialAd.load(activity,
"ca-app-pub-3940256099942544/1033173712",
AdRequest.Builder().build(),object : InterstitialAdLoadCallback() {
override fun onAdLoaded(interstitialAd: InterstitialAd) {
super.onAdLoaded(interstitialAd)
Log.i("nh_ad", "admob interstitial onAdLoaded")
// 加载成功
interAd = interstitialAd
// 设置广告事件回调
interAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdImpression() {
super.onAdImpression()
Log.i("nh_ad", "admob interstitial onAdImpression")
}
override fun onAdShowedFullScreenContent() {
super.onAdShowedFullScreenContent()
Log.i("nh_ad", "admob interstitial onAdShowedFullScreenContent")
}
override fun onAdClicked() {
super.onAdClicked()
Log.i("nh_ad", "admob interstitial onAdClicked")
}
override fun onAdDismissedFullScreenContent() {
super.onAdDismissedFullScreenContent()
Log.i("nh_ad", "admob interstitial onAdDismissedFullScreenContent")
interAd = null
}
override fun onAdFailedToShowFullScreenContent(adError: AdError) {
super.onAdFailedToShowFullScreenContent(adError)
Log.e("nh_ad", "admob interstitial onAdFailedToShowFullScreenContent error:${adError.message}")
interAd = null
}
}
}
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
super.onAdFailedToLoad(loadAdError)
Log.e("nh_ad", "admob interstitial onAdFailedToLoad error:${loadAdError.message}")
interAd = null
// 加载失败
}
})
原因分析:
问题困扰很久, 使用官网 Demo 可以正常显示结果的,网络上搜索不到相关问题。
后来对比了下 官网 Demo 和自己项目的差异,不同点在于我项目是在子进程加载和显示广告的,
尝试去掉子进程后,果然不再报错,基本可以确定这个就是和多进程有关。。
但是搜索 Admob sdk 技术文档,里面并没有接口是设置支持多进程的。。又陷入了无助中
于是我翻阅了 Admob sdk 的源码,看到了用于展示广告的 AdActivity 在 Sdk AndroidManifest 里的声明为:
猜想,能否在自己App的 AndroidManiest里重新声明这个AdActivity 并且加上支持多进程属性?
解决方案:
在 App 的 AndroidManifest 里重新声明 Admob 的广告 Activity,增加支持多进程属性 android:multiprocess = "true"
<activity
android:name="com.google.android.gms.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
android:exported="false"
android:multiprocess="true"
android:theme="@android:style/Theme.Translucent"
tools:ignore="MissingClass" />
这个坑困扰了大半天,特意记录下~