Подтвердить что ты не робот

Биллинг в приложении v3 не может запрашивать элементы без сетевого подключения или в режиме полета/полета

Прохождение файла примера v3 при его изменении с моим проектом отлично работает. Однако мой друг просто проверил код, отключив Wi-Fi и включив режим самолета. Это, по-видимому, не позволяет запросить инвентаризацию в приложении.

// Listener that 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 хранит локально в нем кеш, чтобы не было необходимости иметь сетевое подключение для проверки. Кто-нибудь еще столкнулся с этой проблемой? Надеюсь, что я упустил что-то совершенно очевидное или если это так, как он должен работать.

4b9b3361

Ответ 1

Думаю, я нашел ответ. В следующем примере v3 TrivialDriveExample я вызывал функцию queryInventoryAsync в функции mHelper.startSetup() следующим образом:

Log.d(TAG, "Setup successful. Querying inventory.");
mHelper.queryInventoryAsync(mGotInventoryListener);

Вместо этого теперь я передаю список массивов String из моих SKU, на которые я хочу запросить:

List<String> skulist = new ArrayList<String>();
skulist.add("my_sku_name1");
skulist.add("my_sku_name2");
mHelper.queryInventoryAsync(true, skulist, mGotInventoryListener);

Затем я тестировал, включив режим полета, и я смог запросить мои покупки.

Ответ 2

Проблема в том, что в вашем первом подходе API не знает, какие SKU существуют и по умолчанию (версия с одним параметром) пытается запросить этот список. В режиме самолета это невозможно - либо потому, что он не кэширует список skus, либо существует некоторая внутренняя ошибка, препятствующая его завершению.

Вы можете либо отправить список SKU, которые вы хотите запросить (например, вы сделали это позже), либо вы можете просто подавить онлайн-запрос для списка sku.

helper.queryInventoryAsync(false, yourListener);

кредиты: jmrmb80

Это зависит скорее, если вам нужна эта информация (т.е. отображение цен в вашем приложении).

(см. другие перегрузки для этой функции или уже предоставленные ответы. Скорее всего, вам не нужны SKU для проверки того, была ли сделана покупка. Думаю, поэтому я бы пошел на ответ jmrmb80 - для меня это решило проблема не распознавания покупки в режиме полета

Ответ 4

Я решил проблему:

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, если не сеть.