2015-06-22 2 views
0

Эй, я хочу сделать кнопку, которая увеличивает монеты, которые пользователь имеет, поэтому я проверил, как реализовать в покупках приложений для Android и сделать покупку потребляемой, и все работает нормально, пока я не попытаюсь купить товар снова, когда я нажимаю на кнопке появляется сообщение о том, что товар уже куплен, я искал интернет для людей, у которых была такая же проблема, но я не мог найти что-то, что сработало бы для меня, и я также увидел пример кода, который предоставил Google и Я не вижу ничего отличного от своего кода, и, возможно, это то, чего я не вижу, поэтому, если кто-то поможет мне найти ошибку, которая бы здорово, спасибо.Почему я не могу сделать покупку доступной?

Вот моя активность:

private static final String TAG = "Billing"; 
IabHelper mHelper; 
static final String ITEM_SKU = "android.test.purchased"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(R.layout.main_menu); 

    .... 
    String base64EncodedPublicKey = res.getString(R.string.licenseKey); 
    mHelper = new IabHelper(this, base64EncodedPublicKey); 

    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
     public void onIabSetupFinished(IabResult result) { 
      if (!result.isSuccess()) { 
       Log.d(TAG, "In-app Billing setup failed: " + result); 
      } else { 
       Log.d(TAG, "In-app Billing is set up OK"); 
      } 
     } 
    }); 

    ... 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, 
           Intent data) 
{ 
    if (!mHelper.handleActivityResult(requestCode, resultCode, data)) { 
     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 



IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener 
     = new IabHelper.OnIabPurchaseFinishedListener() { 
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 

     shared = getSharedPreferences("PrefName", Context.MODE_PRIVATE); 
     editor = shared.edit(); 
     int Coins = shared.getInt("CoinsValue", 1000); 

     if (result.isFailure()) { 

      return; 
     } else if (purchase.getSku().equals(ITEM_SKU)) { 
      Toast.makeText(MainMenu.this, "Purchase Complete!", Toast.LENGTH_SHORT).show(); 
      consumeItem(); 
      coinsValue = Coins + 500; 
      editor.putInt("CoinsValue", coinsValue).commit(); 
     } 

    } 
}; 

public void consumeItem() { 
    mHelper.queryInventoryAsync(mReceivedInventoryListener); 
} 

IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener 
     = new IabHelper.QueryInventoryFinishedListener() { 
    public void onQueryInventoryFinished(IabResult result,Inventory inventory) { 
     if (result.isFailure()) { 
      // Handle failure 
     } else { 
      mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU), 
        mConsumeFinishedListener); 
     } 
    } 
}; 

IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = 
     new IabHelper.OnConsumeFinishedListener() { 
      public void onConsumeFinished(Purchase purchase, 
              IabResult result) { 

       if (result.isSuccess()) { 

       } else { 
        // handle error 
       } 
      } 
     }; 

//This is an OnClick for a button in the xml 
public void PurchaseCoins(View view){ 
     interstitial = null; 
    mHelper.launchPurchaseFlow(this, ITEM_SKU, 10001, 
     mPurchaseFinishedListener, "mypurchasetoken"); 
} 
+0

потреблять процесс не удается всегда так вам нужно проверить статус в mConsumeFinishedListener. –

+0

@mohammadsadeghsaati можете ли вы рассказать мне, как мне это сделать? –

ответ

0

Насколько я знаю, нет Gurantee, что потреблять процесс будет успешным, так что вы должны потреблять вашу покупку до тех пор, пока не будет сделано.

поэтому я потребляю детали после успешной покупки в покупке слушателю:

mHelper.consumeAsync(purchase, mConsumeFinishedListener); 

и пользователей Everytime запускает приложение после setuping IAB попробовать еще раз, чтобы потреблять покупки, которые не были потребляет успешно

mHelper.queryInventoryAsync(mGotInventoryListener); 

и это его обратный вызов:

IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new  IabHelper.QueryInventoryFinishedListener() { 
    public void onQueryInventoryFinished(IabResult result, Inventory inventory) { 

     if (result.isFailure()) 
     { 
      return; 
     } 

      Purchase gasPurchase = inventory.getPurchase(YOUR_ITEM); 
      if (gasPurchase != null && verifyDeveloperPayload(gasPurchase)) { 
      mHelper.consumeAsync(getPurchase,mConsumeFinishedListener); 
      return; 
     } 
    } 
}; 

w hich потребляет YOUR_ITEM

и, наконец, если вам не повезло, какие предметы еще не были уничтожены после попытки его покупки снова. IabHelper.OnIabPurchaseFinishedListener возвращает статус, указывающий его, и вы можете повторить попытку для повторного использования элемента.

этот сценарий работает для меня, но вы должны знать, если вашему пользователь может приобрести некоторые детали снова перед закрытием приложения, то лучше повторить для потребления в потребляет обратный вызов, если он был не удалось

+0

Это не работает, и я получаю эту ошибку «Ошибка при проверке: отсутствуют данные» –

+0

нет, неважно, что это сработало благодаря: D –

+0

Но можете ли вы рассказать мне, как сделать это только для одной покупки? –

Смежные вопросы