我正在尝试将Google的应用内结算API3合并到我使用API2的代码中.
我对mHelper(IabHelper对象)的调用成功,所以我连接到谷歌的服务器.看来我可以确定自有项目,因为我的QueryInventoryFinishedListener返回一个包含我所有购买项目的有效库存.我也可以执行购买.
但是,查询sku详细信息失败(getSkuDetails()).以下是Eclipse中所有与IabHelper相关的LogCat输出(我删除了我的软件包名称和产品SKU)导致失败:
12-31 11:47:04.642: D/IabHelper(13633): Starting in-app billing setup. 12-31 11:47:04.832: D/IabHelper(13633): Billing service connected. 12-31 11:47:04.832: D/IabHelper(13633): Checking for in-app billing 3 support. 12-31 11:47:04.832: D/IabHelper(13633): In-app billing version 3 supported for com.XXXX.XXXX 12-31 11:47:04.832: D/IabHelper(13633): Subscriptions AVAILABLE. 12-31 11:47:04.842: D/IabHelper(13633): Starting async operation: refresh inventory 12-31 11:47:04.842: D/IabHelper(13633): Querying owned items, item type: inapp 12-31 11:47:04.842: D/IabHelper(13633): Package name: com.XXXX.XXXX 12-31 11:47:04.842: D/IabHelper(13633): Calling getPurchases with continuation token: null 12-31 11:47:04.912: D/IabHelper(13633): Owned items response: 0 12-31 11:47:04.912: D/IabHelper(13633): Sku is owned: com.XXXX.XXXX.item_one 12-31 11:47:04.922: D/IabHelper(13633): Sku is owned: com.XXXX.XXXX.item_two ... (and 45 other items) ... 12-31 11:47:05.012: D/IabHelper(13633): Continuation token: null 12-31 11:47:05.012: D/IabHelper(13633): Querying SKU details. 12-31 11:47:05.012: D/IabHelper(13633): getSkuDetails() failed: 5:Developer Error 12-31 11:47:05.012: D/IabHelper(13633): Ending async operation: refresh inventory
这似乎不是签名问题,因为我可以成功连接并进行购买.
有没有其他人遇到过getSkuDetails()因"开发者错误"消息而失败的问题,而其他方面的应用程序计费工作?
谢谢你的时间!
我遇到了同样的问题.当您的广告资源中有超过20个SKU时,就会出现此问题.
解决方案是以块的形式获取SKU详细信息.替换querySkuDetails
在IabHelper.java
用:
int querySkuDetails(String itemType, Inventory inv, List<String> moreSkus) throws RemoteException, JSONException { logDebug("Querying SKU details."); ArrayList<String> skuList = new ArrayList<String>(); skuList.addAll(inv.getAllOwnedSkus(itemType)); if (moreSkus != null) { for (String sku : moreSkus) { if (!skuList.contains(sku)) { skuList.add(sku); } } } if (skuList.size() == 0) { logDebug("queryPrices: nothing to do because there are no SKUs."); return BILLING_RESPONSE_RESULT_OK; } while (skuList.size() > 0) { ArrayList<String> skuSubList = new ArrayList<String>( skuList.subList(0, Math.min(19, skuList.size()))); skuList.removeAll(skuSubList); Bundle querySkus = new Bundle(); querySkus.putStringArrayList(GET_SKU_DETAILS_ITEM_LIST, skuSubList); Bundle skuDetails = mService.getSkuDetails(3, mContext.getPackageName(), itemType, querySkus); if (!skuDetails.containsKey(RESPONSE_GET_SKU_DETAILS_LIST)) { int response = getResponseCodeFromBundle(skuDetails); if (response != BILLING_RESPONSE_RESULT_OK) { logDebug("getSkuDetails() failed: " + getResponseDesc(response)); return response; } else { logError("getSkuDetails() returned a bundle with neither an error nor a detail list."); return IABHELPER_BAD_RESPONSE; } } ArrayList<String> responseList = skuDetails .getStringArrayList(RESPONSE_GET_SKU_DETAILS_LIST); for (String thisResponse : responseList) { SkuDetails d = new SkuDetails(itemType, thisResponse); logDebug("Got sku details: " + d); inv.addSkuDetails(d); } } return BILLING_RESPONSE_RESULT_OK; }
这种方法可以获得18个大小的SKU.它对我有用.