Android-платежное исключение
Я проверяю свой счет, и я получил это исключение:
java.lang.IllegalStateException: Can't start async operation (launchPurchaseFlow) because another async operation(launchPurchaseFlow) is in progress.
at utils.IabHelper.flagStartAsync(IabHelper.java:711)
at utils.IabHelper.launchPurchaseFlow(IabHelper.java:316)
at utils.IabHelper.launchPurchaseFlow(IabHelper.java:294)
at com.problemio.SubscribeIntroActivity$6.onClick(SubscribeIntroActivity.java:117)
at android.view.View.performClick(View.java:2532)
at android.view.View$PerformClick.run(View.java:9308)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:4293)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
После того, как я запустил этот код:
Button subscribe = (Button)findViewById(R.id.subscribe);
subscribe.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v)
{
// FIRST CHECK IF THE USER IS ALREADY A SUBSCRIBER.
mHelper.launchPurchaseFlow(SubscribeIntroActivity.this, SUBSCRIBE_SKU, RC_REQUEST, mPurchaseFinishedListener);
}
});
Но до этого я запустил его в качестве тестового пользователя и с идентификатором тестового продукта, который был таким: android.test.purchased, и он работал. Но когда я изменил идентификатор продукта на один из моих собственных идентификаторов продуктов, он потерпел крах за исключением приведенного выше.
Есть идеи, почему это произошло? Спасибо!
4 ответа
IabHelper позволяет одновременно выполнять только один асинхронный запрос. Вам необходимо реализовать onActivityResult()
и передать параметры в handleActivityResult()
метод IabHelper.
Пример кода биллинга в приложении реализует метод следующим образом:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);
// Pass on the activity result to the helper for handling
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
// not handled, so handle it ourselves (here's where you'd
// perform any handling of activity results not related to in-app
// billing...
super.onActivityResult(requestCode, resultCode, data);
}
else {
Log.d(TAG, "onActivityResult handled by IABUtil.");
}
}
На всякий случай, если кому-то не хватает леса за деревьями, как я...
Я получил java.lang.IllegalStateException
трассировка стека в консоли разработчика Play, которая не выдает намного больше, чем сообщение об ошибке... так что я был в тупике.
Я не мог понять, как это происходило сначала, потому что я никогда не думал попробовать нажать кнопку, которая запускает IAB дважды! (он выглядит отключенным после первого касания из-за наложения, которое позволяет пролистывать, [иногда]).
Поэтому убедитесь, что ваши пользователи не могут дважды нажать вашу кнопку.
Вы используете пример кода Google и в строке 793 класса IabHelper есть этот кусок кода
if (mAsyncInProgress) throw new IllegalStateException("Can't start async operation (" +
operation + ") because another async operation(" + mAsyncOperation + ") is in progress.");
и когда вы совершаете покупку в первый раз, "mAsyncInProgress" становится истинным, и до тех пор, пока вы не поглотили свою покупку, она остается истинной, поэтому вам нужно потреблять свою покупку. Я рекомендую вам полностью прочитать все классы в пакете утилит, это поможет вам.
после любой успешной покупки вам нужно ее потреблять
mHelper.consumeAsync(purchase, mConsumeFinishedListener)
но иногда запрос на потребление не выполняется, поэтому вам нужно обрабатывать покупки каждый раз, когда создается ваша деятельность:
mHelper.queryInventoryAsync(mGotInventoryListener);
и попробуйте использовать ваши покупки в обратном вызове mGotInventoryListener.
Получите последнюю версию библиотеки здесь: https://code.google.com/p/marketbilling/source/browse/ где они исправили проблему