添加特定于奖励产品的功能

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

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

确定您的应用的奖励产品

奖励产品的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 Console 中的应用内产品列表中。

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

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

奖励产品工作流程图。

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

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