添加奖励产品特定功能

为用户解锁应用内产品和福利的一种方法是创建奖励产品,即用户在观看视频广告后获得的物品。通过提供奖励产品,您可以让用户在无需直接购买的情况下获得应用内奖励和福利。

本文档介绍了如何实现特定于奖励产品的功能。此页面上的 工作流程图 部分说明了该过程。

识别您的应用程序的奖励产品

奖励产品的 SkuTypeINAPP。为了确保用户能够观看多个广告并获得多个奖励,需要消费这些产品。

在您可以向用户提供奖励产品之前,您必须获取该产品的 SkuDetails。为此,请使用 SkuType.INAPP 作为产品类型调用 querySkuDetailsAsync()

声明适合年龄的广告

为了帮助您遵守与儿童和未成年用户相关的法律义务,包括 儿童在线隐私保护法 (COPPA)通用数据保护条例 (GDPR),您的应用程序应声明在美国哪些广告应被视为针对儿童的广告,以及哪些广告针对的是 其所在国家/地区的适用同意年龄 以下的用户。AdMob 帮助中心解释了您何时应标记广告请求以进行 针对儿童的处理,以及何时应标记以进行 未成年人同意处理,以及执行此操作的效果。

创建应用程序的计费客户端时,请考虑奖励广告请求是否应被视为针对儿童的广告,或者它们是否应针对未成年人同意年龄以下的用户。如果广告请求应包含这些限制,请调用 setChildDirected()setUnderAgeOfConsent() 方法,将适当的值传递到每个方法中。

以下代码片段显示了如何声明视频广告应适合儿童或未成年人同意年龄以下的用户

Kotlin

val billingClient = BillingClient.newBuilder(context)
        .setListener(this)
        .setChildDirected(ChildDirected.CHILD_DIRECTED)
        .setUnderAgeOfConsent(UnderAgeOfConsent.UNDER_AGE_OF_CONSENT)
        .build()

Java

BillingClient billingClient =
    BillingClient.newBuilder(context)
        .setListener(this)
        .setChildDirected(ChildDirected.CHILD_DIRECTED)
        .setUnderAgeOfConsent(UnderAgeOfConsent.UNDER_AGE_OF_CONSENT)
        .build();

加载视频广告

在向用户显示观看视频广告以获得奖励产品的选项之前,您需要加载视频。为此,请创建一个 RewardLoadParams 对象,将其与表示奖励产品的 SkuDetails 对象相关联。然后,调用计费客户端的 loadRewardedSku() 方法,传入 RewardLoadParams 对象和 RewardResponseListener 对象。

视频加载完成后,会通知 RewardResponseListener 侦听器。如果视频不可用,或者发生其他错误(例如服务器超时),也会通知侦听器。

为了在加载与应用程序的奖励产品相关的视频时保持设备性能,请牢记以下最佳实践

  • 一次最多加载三个奖励产品 SKU。
  • 尝试在用户进入应用程序时加载视频。此步骤有助于您检查视频是否仍在加载并可用。
  • 在决定何时加载视频时,请在带宽使用量和应用程序响应能力之间找到最适合您的用例的平衡

    • 最早,请在为相关奖励产品调用 getSkuDetails() 后加载视频。您的应用程序将保持高度响应,但您可能会浪费网络数据来加载用户从未观看过的视频。
    • 最晚,请在用户导航到要显示视频的页面时加载视频。在这种情况下,您的应用程序很少浪费带宽,但用户可能需要等待片刻,直到观看视频的按钮变为可点击状态。

以下代码片段演示了加载在用户获得奖励产品之前播放的视频广告的过程

Kotlin

if (skuDetails.isRewarded()) {
    val params = RewardLoadParams.Builder()
            .setSkuDetails(skuDetails)
            .build()
    mBillingClient.loadRewardedSku(params.build(),
            object : RewardResponseListener {
        override fun onRewardResponse(@BillingResponse responseCode : Int) {
            if (responseCode == BillingResponse.OK) {
                // Enable the reward product, or make
                // any necessary updates to the UI.
            }
        }
    })
}

Java

if (skuDetails.isRewarded()) {
    RewardLoadParams.Builder params = RewardLoadParams.newBuilder();
    params.setSkuDetails(skuDetails);
    mBillingClient.loadRewardedSku(params.build(),
        new RewardResponseListener() {
            @Override
            public void onRewardResponse(int responseCode) {
                if (responseCode == BillingResponse.OK) {
                      // Enable the reward product, or make
                      // any necessary updates to the UI.
                  }
            }
        });
}

向用户提供奖励购买

如果 Google Play 结算库成功加载与奖励商品关联的视频,即如果 RewardResponseListener 收到 responseCodeBillingResponse.OK,则可以启动结算流程。

您可以通过调用 launchBillingFlow() 来开始播放奖励商品的广告,就像您对 所有其他类型的应用内商品 所做的那样。即使用户没有直接购买来获取奖励商品,您仍然需要启用结算流程,以便用户能够获取和使用该商品。

消耗购买

为了通知您的结算客户端用户已收到并消耗了奖励商品,请在结算客户端侦听器的 onPurchasesUpdated() 方法中 处理购买。请注意,奖励购买 需要被消耗

测试您的奖励商品

为了测试您的应用如何加载视频广告并为用户提供奖励商品,请使用授权测试人员,他们默认情况下会获得测试广告而不是真实广告。要了解如何为这些测试人员设置帐户,请参阅 用户测试 Google Play 结算应用

另一种测试方法是使用 android.test.reward 商品 ID。此特定商品是 Google Play 结算中的保留名称,因此您无需在 Play 管理中心中将其添加到您的应用内商品列表中。

注意:在测试您的应用的奖励商品时,不要使用实际商品;否则,您的帐户可能会被标记为垃圾邮件或欺诈帐户。

但是,当您完成测试后,请确保在将您的生产应用部署给最终用户之前,将 android.test.reward 替换为您实际奖励商品的商品 ID。

奖励商品工作流程图

以下时序图显示了用户、您的应用和 Google Play 结算库如何协同工作来显示视频广告并授予用户对奖励商品的访问权限

Sequence diagram showing rewarded products protocol
图 1. 使用 Google Play 结算完成奖励商品购买的步骤