Покупка в приложении для Android, покупка одного и того же товара снова и снова без потребления

Добрый день. Я реализую покупку в приложении для Android. Единственными предметами, которые нужно покупать, являются монеты. И по идее, монеты можно покупать снова и снова. , и вы можете купить его только после потребления. Так что же лучше всего подходит для этой ситуации? Например, я хочу, чтобы пользователь покупал один и тот же набор монет снова и снова. Каков код для этого? Это код, который я использую для процесса покупки в приложении.

 private ServiceConnection serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceDisconnected(ComponentName name) {
        mService = null;
    }

    @Override
    public void onServiceConnected(ComponentName name,
                                   IBinder service) {
        mService = IInAppBillingService.Stub.asInterface(service);

        try {
            Bundle ownedItems = mService.getPurchases(3, getPackageName(), "inapp", null);
            Log.d("Fasfsafasfasfa", "onServiceConnected: "+ownedItems);

            int response = ownedItems.getInt("RESPONSE_CODE");
            Log.d("Fasfsafasfasfa", "onServiceConnected: "+response);

            if (response == 0) {
                ArrayList<String> ownedSkus =
                        ownedItems.getStringArrayList("INAPP_PURCHASE_ITEM_LIST");
                ArrayList<String> purchaseDataList =
                        ownedItems.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
                ArrayList<String> signatureList =
                        ownedItems.getStringArrayList("INAPP_DATA_SIGNATURE_LIST");
                String continuationToken =
                        ownedItems.getString("INAPP_CONTINUATION_TOKEN");


                Log.d("Fasfsafasfasfa", "onServiceConnected: "+ownedSkus.size());
                Log.d("Fasfsafasfasfa", "onServiceConnected: "+purchaseDataList.size());
                Log.d("Fasfsafasfasfa", "onServiceConnected: "+signatureList.size());
                Log.d("Fasfsafasfasfa", "onServiceConnected: "+continuationToken);

                for (int i = 0; i < purchaseDataList.size(); ++i) {
                    String purchaseData = purchaseDataList.get(i);
                    String signature = signatureList.get(i);
                    String sku = ownedSkus.get(i);

                    // do something with this purchase information
                    // e.g. display the updated list of products owned by user
                    Log.d("Fasfsafasfasfa", "onServiceConnected: " + "purchased items are" + sku + " " + signature + " " + purchaseData);
                }

                // if continuationToken != null, call getPurchases again
                // and pass in the token to retrieve more items
            }


            Bundle buyIntentBundle = mService.getBuyIntent(3, getPackageName(),
                    "small_pack", "inapp", "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
            PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT");
            startIntentSenderForResult(pendingIntent.getIntentSender(),
                    1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0),
                    Integer.valueOf(0));
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (IntentSender.SendIntentException e) {
            e.printStackTrace();
        }
    }
};

Я заметил эту проблему, потому что при самой первой покупке все идет хорошо, и всякий раз, когда я пытаюсь снова купить тот же артикул, я получаю фатальное исключение, подобное этому.

 java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.IntentSender android.app.PendingIntent.getIntentSender()' on a null object reference
                                                 at ink.va.activities.BuyCoins$1.onServiceConnected(BuyCoins.java:103)

Что, как я понимаю, означает, что я должен сначала совершить покупку и только после этого снова позволить пользователю купить ее. Я прав? В любом случае, у кого есть предложения по этой проблеме, пожалуйста?


person VA Entertaiment    schedule 14.09.2016    source источник
comment
всякий раз, когда вы пытаетесь купить тот же продукт снова, что такое журнал в LOGCAT ??   -  person Vishal Patoliya ツ    schedule 14.09.2016
comment
вам необходимо использовать продукт inapp, прежде чем покупать его снова, если он уже был куплен.   -  person Rahul Sharma    schedule 14.09.2016
comment
исключение составляет logcat.Кроме потребления нет другого выхода????   -  person VA Entertaiment    schedule 14.09.2016
comment
я имею в виду, что всякий раз, когда я пытаюсь купить снова, я получаю исключение...   -  person VA Entertaiment    schedule 14.09.2016


Ответы (1)


Израсходуйте свой предмет, чтобы сделать его доступным для повторной покупки:

int response = mService.consumePurchase(3, getPackageName(), token);

Предупреждение. Не вызывайте метод ConsumerPurchase в основном потоке. Вызов этого метода запускает сетевой запрос, который может заблокировать ваш основной поток. Вместо этого создайте отдельный поток и вызовите метод servePurchase внутри этого потока.

Расходные материалы могут приобретаться одним и тем же пользователем несколько раз.

Нерасходуемые предметы можно приобрести только один раз.

person kgandroid    schedule 14.09.2016
comment
во всяком случае, я вижу, что другого пути нет... ааа, так и будет... некрасиво, не чисто, но что еще мы можем сделать :( - person VA Entertaiment; 14.09.2016
comment
Это самый чистый способ... см.: developer.android.com/google/ играть/выставление счетов/ - person kgandroid; 14.09.2016