android billing:4.0.0 - queryPurchases(INAPP) 和 purchase.getSku()
Posted
技术标签:
【中文标题】android billing:4.0.0 - queryPurchases(INAPP) 和 purchase.getSku()【英文标题】:android billing:4.0.0 - queryPurchases(INAPP) and purchase.getSku() 【发布时间】:2021-08-08 22:57:59 【问题描述】:我刷新到 android billing 版本 4 和 2 东西不再工作了。
首先我有这个:
else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED)
Purchase.PurchasesResult queryAlreadyPurchasesResult = billingClient.queryPurchases(INAPP); // deprecated
List<Purchase> alreadyPurchases = queryAlreadyPurchasesResult.getPurchasesList();
if(alreadyPurchases!=null)
handlePurchases(alreadyPurchases);
queryPurchases 已弃用。
第二个我有这个:
void handlePurchases(List<Purchase> purchases)
for(Purchase purchase:purchases)
//if item is purchased
if (PRODUCT_ID.equals(purchase.getSku()) && purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED)
if (!verifyValidSignature(purchase.getOriginalJson(), purchase.getSignature()))
// Invalid purchase
// show error to user
Toast.makeText(getApplicationContext(), R.string.plus_error, Toast.LENGTH_SHORT).show();
return;
getSku() 工作正常,但现在标记为Cannot resolve method getSku() in Purchase
任何想法如何解决这个问题?
来自文档:
Summary of changes
Added BillingClient.queryPurchasesAsync() to replace BillingClient.queryPurchases() which will be removed in a future release.
Added Purchase#getSkus() and PurchaseHistoryRecord#getSkus(). These replace Purchase#getSku and PurchaseHistoryRecord#getSku which have been removed.
但我不知道如何在上面的代码中应用这个新命令。
如果我将 getSku 更改为 getSkus,我的 if if (PRODUCT_ID.equals(purchase.getSkus()) && purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED)
会说它总是错误的。而且我不知道如何使用 queryPurchasesAsync(),现在需要 2 个参数。
谢谢。
【问题讨论】:
我也在尝试找出这些变化。但是,您将字符串值 PRODUCT_ID 与 List正如我之前在评论中提到的,您正在将 String 与 List 对象进行比较,但正如 chitgoks 所说,它是 ArrayList<String>
而不是 List<String>
,就像我假设的那样。我不确定您是否会得到多个 sku 字符串(因为您可能不会同时订购多件东西?)但要么仔细查看它们以确保,要么抓住机会将 PRODUCT_ID 与 only 进行比较purchase.getSkus().get(0)。
新的异步购买调用似乎只需要小改动。
旧方法示例:
Purchase.PurchasesResult result = billingClient.queryPurchases(BillingClient.SkuType.SUBS);
doSomethingWithPurchaseList(result.getPurchasesList());
这将是做同样事情的新方法:
billingClient.queryPurchasesAsync(BillingClient.SkuType.SUBS, new PurchasesResponseListener()
@Override
public void onQueryPurchasesResponse(@NonNull BillingResult billingResult, @NonNull List<Purchase> list)
doSomethingWithPurchaseList(list);
);
【讨论】:
感谢您的回答!我会尽力。在此期间,我仍在使用第 3 版。 随着开发人员尝试将计费升级到新版本 4.0.0,我希望这篇文章会引起更多关注。新文档与往常一样不完整,因此我们将自行更新缺失的详细信息。 @Androidcoder 肯定!我认为所有开发人员的情况都一样。 由于 Android Studio 似乎没有将上述 Java sn-p 转换为 Kotlin 代码,因此在 Kotlin 中,新方式看起来像billingClient.queryPurchasesAsync(BillingClient.SkuType.SUBS, PurchasesResponseListener billingResult, list -> doSomethingWithPurchaseList(list) )
@Panther:我不知道除了像上面那样拨打两个电话外,是否还有其他方法,一个用于 SUBS,一个用于 INAPP。虽然我不是专家,但我只是为自己和我的应用程序解决了这个问题,然后在这里分享了我的解决方案,这样就可以有一个解决方案可以在一个电话中完成所有购买。调用两次应该没有问题,除非你想比较订阅和应用内购买或其他东西【参考方案2】:
getSkus 返回一个 ArrayList。请使用“包含”,如下所示。
purchase.getSkus().contains(YOUR_PRODUCT_ID.toLowerCase())
【讨论】:
为什么我们需要使用.toLowerCase()?? @Raii 也许让操作不区分大小写? 哦,我的……谷歌一如既往,一切都变得越来越复杂……【参考方案3】:所以你们都知道新的计费库有新功能
所有内容都将在后台线程中,因此在确认购买和恢复购买期间不要更改主 UI 上的任何内容。
如果您要购买消耗品,那么用户现在可以在一次购买中购买更多数量的相同 sku,因此请相应地编写逻辑。使用 getQuantity() 函数。
恢复非消耗品。
billingClient.queryPurchasesAsync(
BillingClient.SkuType.INAPP,
new PurchasesResponseListener()
@Override
public void onQueryPurchasesResponse(@NonNull BillingResult billingResult, @NonNull List < Purchase > myPurchases)
if (!myPurchases.isEmpty())
for (Object p: myPurchases)
final Purchase purchase = (Purchase) p;
if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED && purchase.getSkus.contains("sku here")
handlePurchase(purchase);
);
)
【讨论】:
以上是关于android billing:4.0.0 - queryPurchases(INAPP) 和 purchase.getSku()的主要内容,如果未能解决你的问题,请参考以下文章
Phonegap/Cordova build android node_modules/q/q.js throw e;