添加奖励商品专用功能

如需让您的用户能够获得应用内商品和福利,有种方法是创建奖励商品,即用户在观看视频广告后收到的商品。您为用户提供奖励商品后,他们就能获得应用内奖励和福利,而不必直接购买。

本文档介绍了如何实现奖励商品专用功能,并在本页的工作流程示意图部分说明了该过程。

确定应用的奖励商品

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

您必须先获取奖励商品的 SkuDetails,然后才能向用户提供相应商品。为此,请调用 querySkuDetailsAsync(),并指定 SkuType.INAPP 作为商品类型。

声明适合相应年龄段的广告

为了帮助履行与儿童和未成年用户相关的法律义务(包括《儿童在线隐私保护法》(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 结算库如何协同工作,向用户展示视频广告并授予用户访问奖励商品的权限:

显示奖励商品协议的序列图
图 1. 使用 Google Play 结算服务完成奖励商品购买的步骤