Skip to content

Android 激励视频广告集成

概述

激励视频广告是一种全屏视频广告,用户观看完整视频后可以获得奖励,具有以下特点:

  • 高用户参与度
  • 高收益潜力
  • 良好的用户体验
  • 适合游戏、工具类应用

集成步骤

参考demo示例的RewardAdHelper

1. 初始化激励视频广告

在 Activity 或 Fragment 中加载激励视频广告:

kotlin
class RewardAdHelper(private val activity: Activity, private val logger: PrintLogger) {
    private var rewardAdObject: RewardAdObject? = null

    /**
     * 加载激励广告
     * 
     * 该方法会创建广告配置,初始化激励广告对象,并设置广告监听器
     * 最后调用load()方法开始加载广告
     */
    fun load() {
        // 创建广告配置对象,设置广告位ID
        val adConfig = UjuAdConfig(
            placementId = DemoConfig.REWARD_ID, // 激励广告位ID
        )
        
        // 初始化激励广告对象
        rewardAdObject = RewardAdObject(activity, adConfig)
        
        // 设置广告监听器,监听广告的各种事件
        rewardAdObject?.setAdObjectListener(object : RewardAdObjectListener {
            /**
             * 广告加载成功回调
             * 
             * @param placementId 广告位ID
             */
            override fun onLoadSuccess(placementId: String) {
                // 广告加载成功,此时可以展示,建议展示前判断isReady
                logger.add("Reward: onLoadSuccess")
            }

            /**
             * 广告加载失败回调
             * 
             * @param error 错误信息
             * @param placementId 广告位ID
             */
            override fun onLoadError(
                error: UjuException,
                placementId: String
            ) {
                // 加载失败,记录错误信息
                logger.add("Reward: onLoadError:${error.message}")
                DemoLogUtils.e("Reward: onLoadError:${error.message}")
            }

            /**
             * 广告展示成功回调
             */
            override fun onAdShow() {
                // 获取广告信息,记录ecpm值
                val adInfo = rewardAdObject?.getAdInfo()
                logger.add("Reward: onAdShow:ecpm${adInfo?.ecpm}")
            }

            /**
             * 广告展示过程中出错回调
             * 
             * @param error 错误信息
             * @param placementId 广告位ID
             */
            override fun onAdError(
                error: UjuException,
                placementId: String
            ) {
                // 记录广告错误信息
                logger.add("Reward: onAdError:${error.message}")
                DemoLogUtils.e("onAdError:${error.message}")
            }

            /**
             * 广告播放完成回调
             */
            override fun onAdPlayComplete() {
                // 记录广告播放完成事件
                logger.add("Reward: onAdPlayComplete")
            }

            /**
             * 广告被点击回调
             */
            override fun onAdClicked() {
                // 记录广告点击事件
                logger.add("Reward: onAdClicked")
            }

            /**
             * 用户跳过视频回调
             */
            override fun onAdSkippedVideo() {
                // 记录用户跳过视频事件
                logger.add("Reward: onAdSkippedVideo")
            }

            /**
             * 奖励到达回调
             * 
             * 当用户观看完广告后,会触发此回调,在此处发放奖励
             */
            override fun onAdRewardArrived() {
                // 记录奖励到达事件
                logger.add("Reward: onAdRewardArrived")
                // 注意:实际应用中,应在此回调中向用户发放奖励
            }

            /**
             * 广告关闭回调
             */
            override fun onAdClosed() {
                // 销毁广告对象,释放资源
                rewardAdObject?.destroy()
                rewardAdObject = null
                // 记录广告关闭事件
                logger.add("Reward: onAdClosed")
            }
        })
        
        // 开始加载广告
        rewardAdObject?.load()
        // 记录加载广告的事件
        logger.add("Reward: load, placementId:${adConfig.placementId}")
        DemoLogUtils.d("Reward: load, placementId:${adConfig.placementId}")
    }

    /**
     * 展示激励广告
     * 
     * 在展示广告前,会检查广告是否已准备就绪
     * 只有当广告状态为ready时,才会调用show()方法展示广告
     */
    fun show() {
        // 检查广告是否已准备就绪
        if (rewardAdObject?.isReady() == true) {
            // 广告已准备就绪,展示广告
            rewardAdObject?.show(activity)
        } else {
            // 广告未准备就绪,记录日志
            logger.add("Reward: 广告还未准备好")
        }
    }

    /**
     * 检查广告是否已加载
     * 
     * @return true表示广告对象已创建,false表示未创建
     * 注意:此方法仅检查广告对象是否存在,不保证广告已准备就绪
     * 要检查广告是否可展示,请使用isReady()方法
     */
    fun isLoaded(): Boolean {
        return rewardAdObject != null
    }

    /**
     * 销毁广告对象
     * 
     * 当不再需要广告时,调用此方法销毁广告对象,释放资源
     */
    fun destroy() {
        // 销毁广告对象
        rewardAdObject?.destroy()
        // 置空广告对象引用
        rewardAdObject = null
    }

}

2. 展示激励视频广告

当用户触发观看广告的行为时(如点击"观看广告获取奖励"按钮),展示广告:

kotlin
fun show() {
    if (rewardAdObject?.isReady() == true) {
        rewardAdObject?.show(activity)
    } else {
        logger.add("Reward: 广告还未准备好")
    }
}

3. 发放奖励

onAdRewardArrived 回调中发放奖励:

kotlin
fun grantReward(reward RewardItem) {
    // 根据奖励类型和数量发放奖励
    val rewardType: String = reward.getType()
    val rewardAmount: Int = reward.getAmount()

    when (rewardType) {
        "coins" -> {
            // 发放金币
            userCoins += rewardAmount
            updateCoinsDisplay()
        }

        "lives" -> {
            // 发放生命值
            userLives += rewardAmount
            updateLivesDisplay()
        }

        "points" -> {
            // 发放积分
            userPoints += rewardAmount
            updatePointsDisplay()
        }

        else -> {}
    }
    
    // 显示奖励提示
}

4. 广告生命周期管理

在 Activity 或 Fragment 的生命周期方法中管理广告的状态:

kotlin
/**
 * 当Activity暂停时调用
 * 
 * 在此方法中暂停广告,以节省资源
 */
override fun onPause() {
    super.onPause()
    // 暂停广告
    if (rewardAdObject != null) {
        rewardAdObject?.pause()
    }
}

/**
 * 当Activity恢复时调用
 * 
 * 在此方法中恢复广告,以便广告能够正常展示
 */
override fun onResume() {
    super.onResume()
    // 恢复广告
    if (rewardAdObject != null) {
        rewardAdObject?.resume()
    }
}

/**
 * 当Activity销毁时调用
 * 
 * 在此方法中销毁广告,释放资源,避免内存泄漏
 */
override fun onDestroy() {
    super.onDestroy()
    // 销毁广告
    if (rewardAdObject != null) {
        rewardAdObject?.destroy()
        rewardAdObject = null
    }
}

最佳实践

1. 广告触发时机

  • 游戏关卡失败后:提供观看广告继续游戏的选项
  • 资源不足时:提供观看广告获得额外资源
  • 解锁内容前:提供观看广告解锁高级内容
  • 每日奖励:提供观看广告获得额外每日奖励

2. 优化建议

  • 预加载广告:在需要展示广告前提前加载
  • 广告状态检查:在展示前检查广告是否已加载
  • 奖励发放:确保奖励发放的可靠性
  • 用户体验:提供清晰的奖励提示
  • 频率控制:避免过度展示广告

3. 避免的问题

  • 不要在用户关键操作时强制展示广告
  • 不要虚假宣传奖励
  • 不要在广告加载失败时影响应用正常功能
  • 不要在用户未完成观看时发放奖励

常见问题

Q: 激励视频广告为什么不显示?

A: 可能的原因:

  • 广告单元 ID 不正确
  • 网络连接问题
  • 广告库存不足
  • 广告未加载完成
  • 设备限制

Q: 如何确保奖励发放的可靠性?

A: 建议:

  • onUserEarnedReward 回调中发放奖励
  • 服务端验证奖励的有效性
  • 本地存储奖励记录,防止意外情况
  • 提供奖励发放失败的重试机制

Q: 如何提高激励视频广告的收益?

A: 建议:

  • 选择合适的广告触发时机
  • 提供有吸引力的奖励
  • 优化广告展示频率
  • 确保广告与应用内容相关
  • 提高应用用户活跃度

相关链接