如何正确更新已弃用的 Android BillingFlowParams 方法

Posted

技术标签:

【中文标题】如何正确更新已弃用的 Android BillingFlowParams 方法【英文标题】:How to properly update Android BillingFlowParams methods deprecated 【发布时间】: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)

【问题讨论】:

【参考方案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。

以上是关于如何正确更新已弃用的 Android BillingFlowParams 方法的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中,如何删除已弃用的通知变量?

我应该如何在 Android 中使用/不使用已弃用的方法

swift 2.3 如何正确使用已弃用的 CBCentralManagerState

如何手动更新已弃用的类型包

处理已弃用的 android.text.ClipboardManager

如何从已弃用的 Supervisor.spec 更新为新的 Supervisor.behaviour?