添加激励商品专属功能

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

本文档介绍了如何实现激励商品专属功能。此页面的工作流程图部分说明了此过程。

识别应用的激励商品

激励商品的 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 Billing Library 成功加载了与激励商品相关的视频(即 RewardResponseListener 收到的 responseCodeBillingResponse.OK),您就可以启动结算流程。

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

消耗购买交易

要通知您的结算客户端用户已收到并消耗了激励商品,请在结算客户端监听器的 处理购买交易 onPurchasesUpdated() 方法中进行操作。请注意,激励购买交易需要消耗

测试激励商品

如需测试您的应用如何加载视频广告以及向用户提供激励商品,请使用许可测试人员,他们默认会获得测试广告而非实际广告。要了解如何为这些测试人员设置账号,请参阅用户测试 Google Play Billing 应用

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

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

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

激励商品工作流程图

以下序列图展示了用户、您的应用和 Google Play Billing Library 如何协作,以显示视频广告并授予用户对激励商品的访问权限

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