【问题标题】:android billing:4.0.0 - queryPurchases(INAPP) and purchase.getSku()android billing:4.0.0 - queryPurchases(INAPP) 和 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()) &amp;&amp; purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) 会说它总是错误的。而且我不知道如何使用 queryPurchasesAsync(),现在需要 2 个参数。

谢谢。

【问题讨论】:

  • 我也在尝试找出这些变化。但是,您将字符串值 PRODUCT_ID 与 List purchase.getSkus() 进行比较,难道不是您的问题吗?也许尝试 if (PRODUCT_ID.equals(purchase.getSkus().get(0) &&.....) 代替?
  • getSkus() 返回一个 ArrayList。也许遍历它们中的每一个并执行您的 PRODUCT_ID.equals() ?由于更改而不得不更改代码块是令人恼火的。如果只是方法/参数名称更改就可以了。他们还必须更改 billingClient.queryPurchases()。
  • @chitgoks 谢谢,我会试试的。是的,新版本,还有更多工作要做。
  • 他们杀死了 billing 2.0,那些 b@stards )) 要是他们更新了文档就好了!现在是 2021 年 7 月,仍然没有记录

标签: java android in-app-purchase in-app-billing


【解决方案1】:

正如我之前在评论中提到的,您正在将 String 与 List 对象进行比较,但正如 chitgoks 所说,它是 ArrayList&lt;String&gt; 而不是 List&lt;String&gt;,就像我假设的那样。我不确定您是否会得到多个 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 -&gt; doSomethingWithPurchaseList(list) })
  • @Panther:我不知道除了像上面那样拨打两个电话外,是否还有其他方法,一个用于 SUBS,一个用于 INAPP。虽然我不是专家,但我只是为自己和我的应用程序解决了这个问题,然后在这里分享了我的解决方案,这样就可以有一个解决方案可以在一个电话中完成所有购买。调用两次应该没有问题,除非你想比较订阅和应用内购买或其他东西
【解决方案2】:

getSkus 返回一个 ArrayList。请使用“包含”,如下所示。

purchase.getSkus().contains(YOUR_PRODUCT_ID.toLowerCase())

【讨论】:

  • 为什么我们需要使用.toLowerCase()??
  • @Raii 也许让操作不区分大小写?
  • 哦,我的……谷歌一如既往,一切都变得越来越复杂……
【解决方案3】:

所以你们都知道新的计费库有新功能

  1. 所有内容都将在后台线程中,因此在确认购买和恢复购买期间不要更改主 UI 上的任何内容。

  2. 如果您要购买消耗品,那么用户现在可以在一次购买中购买更多数量的相同 sku,因此请相应地编写逻辑。使用 getQuantity() 函数。

  3. 恢复非消耗品。

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);
            }

          }
        });
    }
  }
)

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2018-12-30
    • 1970-01-01
    • 2012-05-22
    • 2012-07-12
    相关资源
    最近更新 更多