You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:29:37