Как запросить информацию (цену) для нескольких продуктов в приложении одновременно?

В Android при выставлении счетов за приложение можно ли как-то запросить информацию (цену) для всех продуктов, используя один запрос? В идеале вы можете передать идентификаторы продуктов, и он вернет информацию для них.

Я ищу эквивалент SKProductsRequest для Android Market. http://developer.apple.com/library/ios/#documentation/StoreKit/Reference/SKProductsRequest/Reference/Reference.html#//apple_ref/occ/cl/SKProductsRequest


person randomguy    schedule 06.05.2011    source источник


Ответы (2)


Теперь это возможно с Billing API v3. Вы можете получить информацию с помощью метода getSkuDetails(). Пример приведен здесь.

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;
        }
    }
}
person Sergey Glotov    schedule 05.06.2011
comment
Большое спасибо за пост, все работает! Но у меня есть вопрос: возвращает ли getSkuDetails() локализованную валюту или установленную разработчиком цену по умолчанию, которая указана в долларах США? Мне кажется, он возвращает только доллар США, несмотря на то, что я установил свою систему и учетную запись Google Play на Францию. Вы знаете, где это будет задокументировано? Я не мог найти достаточно документов для этого. - person sammiwei; 03.04.2013
comment
@sammiwei Извините, я не знаю. - person Sergey Glotov; 03.04.2013
comment
price_currency_code указывает валюту в пакете skuDetails - person Cory Roy; 25.01.2017

Фрагменты примеров 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);

Второй параметр здесь — артикулы продукта, третий (здесь я не использую) — артикулы подписки.

Во-вторых: затем в 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.

person Csaba Toth    schedule 03.06.2019