Android Billing 4.0.0 queryPurchases与getSku方法失效适配方案咨询
Android Billing 4.0.0 版本适配解决方案
问题1:Purchase类getSku()方法不存在,替换后判断条件恒为false
官方在4.0版本移除了原有的getSku()方法,替换为getSkus(),该方法返回值为List<String>类型(适配多商品合并购买场景),直接用字符串和列表做等值判断必然返回false。
适配代码修改如下:
void handlePurchases(List<Purchase> purchases) { for(Purchase purchase:purchases) { // 单商品购买场景可直接判断列表包含目标商品ID,也可通过get(0)取首个sku对比 if (purchase.getSkus().contains(PRODUCT_ID) && purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) { if (!verifyValidSignature(purchase.getOriginalJson(), purchase.getSignature())) { Toast.makeText(getApplicationContext(), R.string.plus_error, Toast.LENGTH_SHORT).show(); return; } // 原有后续业务逻辑无需修改
如果你的业务支持多商品合并购买,自行遍历getSkus()返回的列表做对应逻辑处理即可。
问题2:queryPurchases()方法废弃,替换为queryPurchasesAsync()
queryPurchasesAsync()需要两个参数:第一个是QueryPurchasesParams实例,用于指定查询的商品类型;第二个是查询结果的回调接口,查询结果将异步返回。
适配代码修改如下:
else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED) { // 构建查询参数,指定查询普通内购商品,订阅商品可传BillingClient.ProductType.SUBS QueryPurchasesParams params = QueryPurchasesParams.newBuilder() .setProductType(BillingClient.ProductType.INAPP) .build(); billingClient.queryPurchasesAsync(params, (billingResult1, purchaseList) -> { if (billingResult1.getResponseCode() == BillingClient.BillingResponseCode.OK && purchaseList != null) { handlePurchases(purchaseList); } }); }
内容的提问来源于stack exchange,提问作者RGS
相关产品推荐
相关产品推荐

