Android Studio新手求助:Admob激励视频广告自动跳转奖励Activity问题
解决AdMob激励视频广告结束后自动跳转奖励Activity的问题
嗨,我完全懂你的困扰——刚上手AdMob的时候很容易踩回调逻辑的坑😉。你现在的问题大概率是把启动奖励Activity的代码放在了奖励触发的回调里(比如onUserEarnedReward),而不是广告关闭的回调里,导致视频一播放完就直接跳转,没给用户点击关闭广告的机会。
下面分AdMob的新旧版本给你针对性的解决方案:
情况1:使用新版RewardedAd(官方推荐,旧版已废弃)
如果用的是Google现在主推的RewardedAd,核心是调整回调的执行顺序:
- 不要在
onUserEarnedReward()里启动奖励Activity,这个回调只是确认用户完成广告、具备领奖资格的时机,我们可以在这里先标记用户已获得奖励(比如存个布尔变量isRewardEarned = true)。 - 真正启动奖励Activity的逻辑,要放在
FullScreenContentCallback的onAdDismissedFullScreenContent()回调里——也就是用户主动关闭广告之后。
示例代码参考:
// 定义变量标记用户是否获得奖励 private var isRewardEarned = false // 加载并展示激励视频广告的逻辑 fun loadAndShowRewardedAd() { val adRequest = AdRequest.Builder().build() RewardedAd.load(this, "你的广告单元ID", adRequest, object : RewardedAdLoadCallback() { override fun onAdLoaded(rewardedAd: RewardedAd) { // 设置全屏广告的回调 rewardedAd.fullScreenContentCallback = object : FullScreenContentCallback() { override fun onAdDismissedFullScreenContent() { // 广告被用户关闭后,检查是否符合领奖条件 if (isRewardEarned) { // 这里才启动你的奖励Activity startActivity(Intent(this@YourGameActivity, RewardActivity::class.java)) isRewardEarned = false // 重置标记,避免重复触发 } } override fun onAdFailedToShowFullScreenContent(adError: AdError) { // 广告展示失败的处理逻辑(比如提示用户稍后再试) } } // 设置奖励回调 rewardedAd.setUserEarnedRewardListener { rewardItem -> // 仅标记用户获得奖励,不要在这里启动Activity isRewardEarned = true // 也可以在这里先处理基础奖励逻辑,比如给游戏账号加金币 } // 展示广告 rewardedAd.show(this@YourGameActivity) } override fun onAdFailedToLoad(loadAdError: LoadAdError) { // 广告加载失败的处理逻辑 } }) }
情况2:使用旧版RewardedVideoAd(不推荐,已被官方废弃)
如果你还在使用旧版的RewardedVideoAd,逻辑思路是一样的:
- 在
onRewarded()回调里标记用户获得奖励,不要启动Activity。 - 在
onRewardedVideoAdClosed()回调里再执行启动奖励Activity的操作。
示例代码参考:
private var isRewardEarned = false private lateinit var rewardedVideoAd: RewardedVideoAd // 初始化旧版激励视频广告 fun initRewardedVideoAd() { rewardedVideoAd = MobileAds.getRewardedVideoAdInstance(this) rewardedVideoAd.rewardedVideoAdListener = object : RewardedVideoAdListener { override fun onRewarded(rewardItem: RewardItem) { // 标记用户已获得奖励 isRewardEarned = true } override fun onRewardedVideoAdClosed() { // 广告关闭后再启动奖励Activity if (isRewardEarned) { startActivity(Intent(this@YourGameActivity, RewardActivity::class.java)) isRewardEarned = false } // 可以在这里重新加载广告,方便下次展示 } // 其他回调方法按需实现 override fun onRewardedVideoAdLoaded() {} override fun onRewardedVideoAdOpened() {} override fun onRewardedVideoStarted() {} override fun onRewardedVideoAdFailedToLoad(errorCode: Int) {} override fun onRewardedVideoCompleted() {} } }
关键要点总结
- 核心逻辑区分:奖励触发回调是确认用户具备领奖资格的时机,广告关闭回调是用户真正结束广告交互的时机,两者不要混淆。
- 必须用布尔变量标记领奖状态,避免用户中途退出广告时错误发放奖励。
- 启动奖励Activity后记得重置标记,防止重复触发跳转。
如果你的代码和上面的逻辑有出入,可以把具体代码贴出来,我再帮你针对性调整~
内容的提问来源于stack exchange,提问作者Sendul
相关产品推荐
相关产品推荐

