【问题标题】:How to properly update Android BillingFlowParams methods deprecated如何正确更新已弃用的 Android BillingFlowParams 方法
【发布时间】:2019-07-12 03:51:09
【问题描述】:

我有

BillingFlowParams purchaseParams = BillingFlowParams.newBuilder().setSku(skuId).setType(billingType).setOldSkus(oldSkus).build();

但现在

setSku

setType

setOldSkus

都已弃用。

我想更新旧代码,但不发布与活动订阅和未来订阅混淆的更新。 我应该如何正确更新上述代码?

目前我使用 一个String myProduct="my_newsweek_1"; 识别购买和BillingClient.SkuType.SUBS识别类型, 我只是将null 传递给setOldSkus

文档报告

setSku (String sku)setType (String type) 已替换为 setSkuDetails(SkuDetails) (这个SkuDetails 对象在构造函数中只接收一个String 作为参数并抛出JSONException 所以似乎它不适用于旧的String 常量)

setOldSkus(ArrayList<String> oldSkus) 已替换为setOldSku(String)

【问题讨论】:

    标签: android android-billing


    【解决方案1】:

    将您的代码替换为下面的更新计费库版本

      mBillingFlowParams = BillingFlowParams.newBuilder()
                                .setSkuDetails(skuDetailsList.get(0))
                                .setSubscriptionUpdateParams(BillingFlowParams.SubscriptionUpdateParams.newBuilder()
                                    .setOldSkuPurchaseToken(oldPurchaseToken)
                                    .setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.DEFERRED)
                                    .build())
                                .build()
                            mBillingClient.launchBillingFlow(context, mBillingFlowParams)

    【讨论】:

      【解决方案2】:

      您需要 launchBillingFlow() 的 BillingFlowParams。您可以使用自己的 json 字符串创建 SkuDetails,但这不是预期的方式。您应该首先致电querySkuDetailsAsync() 并获取必要的skuDetailsList,然后将它们用于launchBillingFlow()

      
      public void querySkuDetailsAsync(@SkuType final String itemType, final List<String> skuList, final SkuDetailsResponseListener listener) {
          Runnable queryRequest = new Runnable() {
              @Override
              public void run() {
                  // Query the purchase async
                  SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
                  params.setSkusList(skuList).setType(itemType);
                  mBillingClient.querySkuDetailsAsync(params.build(),
                          new SkuDetailsResponseListener() {
                              @Override
                              public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) {
                                  //use skuDetails in skuDetailsList
                              }
                          });
                  }
              };
          executeServiceRequest(queryRequest);
      }
      
      public void initiatePurchaseFlow(final SkuDetails skuDetails) {
         Runnable purchaseFlowRequest = new Runnable() {
            @Override
            public void run() {
            Log.d(TAG, "Launching in-app purchase flow.");
            BillingFlowParams purchaseParams = BillingFlowParams.newBuilder().setSkuDetails(skuDetails).build();
               mBillingClient.launchBillingFlow(mActivity, purchaseParams);
            }
         };
         executeServiceRequest(purchaseFlowRequest);
      }
      

      【讨论】:

      • 这不是我问的。我知道我需要launchBillingFlow,我不知道如何将我的sku参数转换为适合新版本已弃用方法的格式
      • 只有一个新版本的弃用方法,它是 setSkuDetails(),所以你需要传递 SkuDetails 对象。你可以通过 querySkuDetailsAsync() 得到它。
      • 我不知道如何将我的字符串常量转换为SkuDetails object,以便使用setSkuDetails,因此我在这里问过。你能帮帮我吗?
      • 正如我在答案中所写,您可以首先将常量转换为 json 并创建 new SkyDetails(jsonString),但它 NOT 是正确的解决方案。 Google 希望您通过 querySkuDetailsAsync() 获取这些详细信息,这就是不推荐使用这些方法的原因。
      • @underoid 是对的。我们的想法是编写一个函数,首先使用querySkuDetailsAsync 从google play 请求您的所有SKU,然后您将获得所有SkuDetails 的列表。从您需要的列表中保存一个 SkuDetails,例如在 mySkuDetail 中。然后拨打BillingFlowParams.newBuilder().setSkuDetails(mySkuDetail).build();。而已。无需创建 json。谷歌甚至没有定义常量以防止用户创建自己的自定义 json。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 2012-04-23
      • 2021-06-17
      相关资源
      最近更新 更多