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()) &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 月,仍然没有记录 【参考方案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】:

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

    所有内容都将在后台线程中,因此在确认购买和恢复购买期间不要更改主 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()的主要内容,如果未能解决你的问题,请参考以下文章

Android Q 正式命名为 Android 10

Android安卓Q适配指南-相册

Phonegap/Cordova build android node_modules/q/q.js throw e;

Xamarin.Android 无法在 Android 10 (Q) 中将录制的自定义声音用于推送通知

Android 10 (Q) 中的后台服务录像机

[渲染过程中的Android P和Q中的Android WebView崩溃