添加奖励产品专用功能

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

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

确定应用的奖励产品

奖励产品的 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 结算服务完成奖励产品购买的步骤