应用内计费v3无法查询项目没有网络连接或在飞机/飞行模式



通过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详细信息

最新更新