onIabPurchaseFinished никогда не звонил.
Я пытался настроить биллинг в своем первом приложении и использовал sku android.test.purchased. Покупка завершена, и мне удается поместить SKU в свой инвентарь, но, как следует из названия, onIabPurchaseFinished никогда не вызывается.
Я думаю, что это может иметь какое-то отношение к этому журналу: "Не удалось сохранить, какое представление имеет фокус, потому что сфокусированное представление com.android.internal.policy.impl.PhoneWindow$DecorView@406743d0 не имеет идентификатора". Это всплывает прямо перед переходом в Google Play. Я не совсем уверен, что это значит, хотя...
Запуск покупки:
mHelper.launchPurchaseFlow(this, sku, 10001, mPurchaseFinishedListener, "");
И слушатель:
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
@Override
public void onIabPurchaseFinished(IabResult result, Purchase info) {
System.out.println("Purchase Finish heard something");
if (result.isFailure()) {
Log.d(TAG, "Error purchasing: " + result);
return;
} else{
Log.d(TAG,"Success!");
}
}
};
5 ответов
Попробуйте добавить это в активность, которая вызывает mHelper.launchPurchaseFlow(..)
:
@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.");
}
}
Я только что обнаружил еще одну важную вещь: код запроса, который используется для запуска потока покупок, должен быть>= 0!
я использовал "new Random().nextInt()" для генерации случайного requestCode, и иногда это работало, иногда - нет. теперь я обнаружил в следующей документации, что код запроса не должен быть отрицательным числом:
http://developer.android.com/reference/android/app/Activity.html
У меня была та же проблема, и onActivityResult также не вызывался.
Вдохновленный ответом @Ghulam, я понял, что действие onActivityResult не вызывает автоматически onActivityResult фрагмента, поэтому мне пришлось делать это вручную.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(mCurrentFragment!= null){
mCurrentFragment.onActivityResult(requestCode, resultCode, data);
}
}
Вам нужно вызвать защищенный void onActivityResult(); В вашей родительской активности вместо MainActivity(Trivial Drive), откуда вы вызываете свою MainActivity, которая называется Trivial Drive Activity.
Вы получите значения кода результата -1, если покупка прошла успешно, иначе 0.
Я столкнулся с той же проблемой, и принятое решение уже было реализовано, но я не мог сказать, что вызвало это. Переход на новую Google Play Billing Library 1.0 (выпущена 19 сентября 2017 года) исправил эту проблему для меня!
Я надеюсь, что следующие ссылки помогут кому-то, кто хотел бы реализовать новую библиотеку:
Сообщение в блоге Google о выпуске
Учебный класс Play Billing Library
Образец Google Trivial Drive v2
Кодовая метка Play Billing Library, опубликованная в Google I / O 2017