如何正确更新已弃用的 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 方法的主要内容,如果未能解决你的问题,请参考以下文章
swift 2.3 如何正确使用已弃用的 CBCentralManagerState