通过v3示例文件修改它与我的项目工作良好。然而,我的朋友只是通过关闭wi-fi并打开飞行模式来测试代码。这似乎导致无法查询应用内库存。
// Listener that's called when we finish querying the items and subscriptions we own
private final IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
@Override
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
if (result.isFailure()) {
// STOPS here and doesn't continue on with no network connection
return;
}
......
}
};
我认为在最初的成功购买之后,v3将其存储在本地的缓存中,这样它就不必总是有网络连接来检查。还有其他人遇到过这个问题吗?我希望我错过了一些完全明显的东西,或者如果这是它应该如何工作。
我想我可能找到答案了。在以下v3的trivialdrive示例中,我在mHelper.startSetup()函数中调用queryInventoryAsync函数,如下所示:
Log.d(TAG, "Setup successful. Querying inventory.");
mHelper.queryInventoryAsync(mGotInventoryListener);
现在我传递的是我想要查询的sku的字符串数组列表:
List<String> skulist = new ArrayList<String>();
skulist.add("my_sku_name1");
skulist.add("my_sku_name2");
mHelper.queryInventoryAsync(true, skulist, mGotInventoryListener);
然后我通过打开飞行模式进行测试,我能够查询我的购买!
问题是,在您的第一种方法中,API不知道存在哪些sku,并且默认情况下(单参数版本)试图查询该列表。在飞行模式下,这是不可能的-要么是因为它没有缓存skus列表,要么是有一些内部错误阻止它完成。
您可以发送您想要查询的sku列表(就像您稍后所做的那样),或者您可以直接抑制sku列表的在线查询。
helper.queryInventoryAsync(false, yourListener);
归功于:jmrmb80
这更有可能取决于你是否需要这些信息(即在你的应用程序中显示价格)。
(参见该函数的其他重载或已经给出的答案)。我认为,您很可能不需要sku来检查是否进行了购买,因此我会选择jmrmb80的答案-对我来说,这解决了在飞行模式下无法识别购买的问题
对我来说,下面的工作…
不是mHelper。queryInventoryAsync(假,mGotInventoryListener);
mHelper.queryInventoryAsync (mGotInventoryListener);
我在另一个链接中发现了刷新库存(查询物品价格)的错误。(回复:6:错误)
我解决了这个问题:
final ArrayList<String> iabItemSkus = new ArrayList<String>();
iabItemSkus.add(MyGame.productID_FULLVERSION);
// Disable SKU details if no network connection
boolean checkSkuDetails = isWifiConnected() ? true : false;
Gdx.app.log("IAB", "checkSkuDetails : " + checkSkuDetails);
mHelper.queryInventoryAsync(checkSkuDetails, iabItemSkus, mGotInventoryListener);
如果没有网络,则不获取Sku详细信息