如何一次查询多个应用内商品的(价格)信息?

时间:2011-05-06 14:01:53

标签: android in-app-purchase google-play

在Android应用程序结算中,是否可以使用一个查询以某种方式查询所有产品的(价格)信息?最理想的情况是,您可以传递产品ID,并返回信息。

我正在寻找的是Android Market的SKProductsRequest等价物。 http://developer.apple.com/library/ios/#documentation/StoreKit/Reference/SKProductsRequest/Reference/Reference.html#//apple_ref/occ/cl/SKProductsRequest

2 个答案:

答案 0 :(得分:14)

现在可以使用Billing API v3。您可以使用getSkuDetails()方法获取信息。示例是here

ArrayList skuList = new ArrayList();
skuList.add("premiumUpgrade"); 
skuList.add("gas");
Bundle querySkus = new Bundle();
querySkus.putStringArrayList("ITEM_ID_LIST", skuList);

Bundle skuDetails = mService.getSkuDetails(3, getPackageName(), "inapp", querySkus);

int response = skuDetails.getInt("RESPONSE_CODE");
if (response == 0) {
    ArrayList responseList = skuDetails.getStringArrayList("DETAILS_LIST");

    for (String thisResponse : responseList) {
        JSONObject object = new JSONObject(thisResponse);
        String sku = object.getString("productId");
        String price = object.getString("price");
        if (sku.equals("premiumUpgrade")) {
            mPremiumUpgradePrice = price;
        } else if (sku.equals("gas")) { 
            mGasPrice = price;
        }
    }
}

答案 1 :(得分:0)

我看到的Google示例代码段(如https://developer.android.com/google/play/billing/billing_integrate.html#QueryDetails)和其他代码段都不适合我的用法。我要么需要一个inventory实例,要么需要一个mHelper(这是IAB帮助器)。看起来问题的投票数大于接受的答案的投票数,所以我并不孤单。我的用法类似于TrivialDrive示例(https://github.com/googlesamples/android-play-billing/blob/master/TrivialDrive/),因此让我们来看一下。

MainActivity onCreate中有一个呼叫queryInventoryAsync的电话:

    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
        public void onIabSetupFinished(IabResult result) {
            Log.d(TAG, "Setup finished.");
            ...

            // IAB is fully set up. Now, let's get an inventory of stuff we own.
            Log.d(TAG, "Setup successful. Querying inventory.");
            try {
                mHelper.queryInventoryAsync(mGotInventoryListener);
            } catch (IabAsyncInProgressException e) {
                complain("Error querying inventory. Another async operation in progress.");
            }
        }
    });

在侦听器中,您将拥有清单实例。

IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
        Log.d(TAG, "Query inventory finished.");
        ...
        Log.d(TAG, "Initial inventory query finished; enabling main UI.");
    }
};

我的问题是我的应用内商品是易消耗品,无论用户是否已经购买某些商品,我都希望一开始就查询商品的全部信息。例如,我想知道所有以当地货币而不只是美元表示的产品的价格,因此在已经投入过多的购买之前要通知用户。通常,queryInventory仅退还用户已经购买/处理过的内容(可消费或不可消费的产品,订阅等)。

如果您穿着同一双鞋(想一开始就知道所有细节),则需要做两件事:

  1. 您需要在queryInventoryAsync内调用mHelper.startSetup的多态变体。
  2. 在侦听器中,您可以迭代SKU并查看详细信息。

因此,第一

String[] SKUS = { SKU_1, SKU_2, SKU_3, SKU_4, SKU_5 };  // products
...
mHelper.queryInventoryAsync(true, Arrays.asList(SKUS), new ArrayList<String>(), mGotInventoryListener);

这里的第二个参数是产品SKU,第三个(我不在这里使用)是订阅SKU。

第二:然后在QueryInventoryFinishedListener内将所有这些都保存在inventory中,然后可以遍历SKU:

        for (String sku: SKUS) {
            SkuDetails skuDetails = inventory.getSkuDetails(sku);
            String price = skuDetails.getPrice();
            ((android.widget.TextView)findViewById( *sku's ID* )).setText(price);
        }

希望这会有所帮助。很快,我需要升级到非基于AIDL的解决方案。