Admob 21.4.0:onUserEarnedReward未调用,激励视频关闭按钮不可点击求助
我之前在使用Admob 21.4.0版本时也碰到过几乎一模一样的问题——明明严格跟着官方文档走,却出现onUserEarnedReward不触发、关闭按钮点不动只能按返回键退出的情况。结合当时的排查经验,给你几个核心的排查方向:
1. 检查依赖配置是否完整且无冲突
确保你的build.gradle里的Admob依赖是完整的,而且没有和其他广告库或Google服务库版本冲突:
// 确保依赖是21.4.0版本,且无重复引入 implementation 'com.google.android.gms:play-services-ads:21.4.0'
另外,检查AndroidManifest.xml里的元数据是否正确配置了Admob应用ID,有没有拼写错误:
<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="你的应用ID"/>
2. 确认广告生命周期的回调注册逻辑
激励视频广告的回调必须在广告加载前就完成注册,而且要确保持有广告实例的对象(比如Activity/Fragment)没有被意外销毁。我当时就是因为在加载广告后才设置回调,导致根本没绑定上:
// 正确顺序:先创建回调,再加载广告 val rewardAdLoadCallback = object : RewardAdLoadCallback() { override fun onAdLoaded(rewardAd: RewardAd) { // 广告加载成功后,设置全屏内容回调 rewardAd.setFullScreenContentCallback(object : FullScreenContentCallback() { override fun onAdDismissedFullScreenContent() { // 广告关闭后的清理逻辑 } override fun onAdFailedToShowFullScreenContent(adError: AdError) { // 广告展示失败处理 } }) // 展示广告时必须绑定奖励回调 rewardAd.show(activity) { rewardItem -> // 这里就是onUserEarnedReward的触发逻辑,别遗漏! val rewardAmount = rewardItem.amount val rewardType = rewardItem.type // 处理用户奖励发放 } } override fun onAdFailedToLoad(loadAdError: LoadAdError) { // 广告加载失败处理 } } // 加载广告 RewardAd.load( context, "你的激励视频广告ID", AdRequest.Builder().build(), rewardAdLoadCallback )
Java代码同理,要确保OnUserEarnedRewardListener被正确设置,不能省略这个监听器。
3. 排查测试广告的特殊情况
有时候用测试广告ID时会出现一些异常(虽然官方说测试广告和正式广告逻辑一致,但偶尔会有例外)。你可以尝试切换到正式广告ID测试,或者检查测试设备是否正确添加到Admob后台的测试设备列表中。
4. 检查Activity的生命周期处理
如果广告在Fragment中加载,要确保Fragment生命周期和Activity同步,比如在onDestroyView时销毁广告实例,避免内存泄漏导致回调失效:
override fun onDestroyView() { super.onDestroyView() rewardAd?.fullScreenContentCallback = null rewardAd = null }
另外,避免当前Activity设置singleInstance等特殊启动模式,否则广告窗口可能无法获取焦点,导致关闭按钮无法点击。
5. 清除Admob缓存并重启设备
这个方法听起来简单,但有时候确实能解决奇怪的问题。你可以先清除应用缓存,重启设备后再重新测试广告——我当时排查完所有代码逻辑都没问题,清缓存重启后关闭按钮就恢复正常了。
内容的提问来源于stack exchange,提问作者韩江云

