onIabPurchaseFinished nigdy nie wywołano.

111

Próbuję skonfigurować rozliczenia w aplikacji dla mojej pierwszej aplikacji i korzystam ze SKU android.test.purchased. Zakup przychodzi i udaje mi się umieścić SKU w moim ekwipunku, ale, jak mówi tytuł, onIabPurchaseFinished nigdy nie jest wywoływany.

Myślę, że może to mieć coś wspólnego z tym dziennikiem: „Nie można zapisać, który widok ma fokus, ponieważ widok skoncentrowany com.android.internal.policy.impl.PhoneWindow$DecorView@406743d0 nie ma identyfikatora”. Pojawia się tuż przed przejściem do Google Play. Nie jestem jednak pewien, co to oznacza ...

Rozpoczęcie zakupu:

mHelper.launchPurchaseFlow(this, sku, 10001, mPurchaseFinishedListener, "");

A słuchacz:

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!");
             }


    }
};
AAAton
źródło
Powinienem może dodać, że próbuję to zrobić z poziomu zakładki
AAAton
Ustawiłem id programowo, ale bez różnicy.
AAAton,

Odpowiedzi:

206

Spróbuj dodać to do działania, które wywołuje 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.");
    }
}
bugzy
źródło
16
miał ten sam problem i to działało idealnie. Ale chcę wiedzieć, dlaczego oddzwanianie nie jest wykonywane tak, jak można by przypuszczać, dlaczego musimy wykonywać połączenie do tego samego siebie? W pewnym sensie wywołanie zwrotne jest bezużyteczne: /
Spider
4
Pomogło mi też, dzięki. @Spider, powodem, dla którego potrzebujesz tej metody w swoim Activity, jest to, że w przeciwnym razie metoda mHelper handleActivityResult () nie zostanie wywołana. Innymi słowy, jest to rzeczywista / standardowa handleActivityResult () potrzebna w Activity, a metoda mHelper jest w rzeczywistości zwykłą starą metodą.
gcl1
8
Dzięki za to. Jest to błąd w dokumentacji (nigdy nie wspominają o potrzebie tego lub w IabHelper. Funkcja launchPurchaseFlow () IabHelper wywołuje metodę startIntentSenderForResult - która po zakończeniu wywoła funkcję onActivityResult () Twojej aktywności.
Jerry Brady
3
Myślałem, że rozwiązałem swój problem, kiedy to znalazłem ... potem zdałem sobie sprawę, że już zaimplementowałem tę funkcję i nadal nie działa ... westchnij
Matt K
3
Zauważ, że przesłanianie onActivityResult () na fragmencie nie działa, należy to zrobić na Activity
cprcrack
8

Właśnie odkryłem kolejną ważną rzecz: kod requestCode używany do uruchomienia przepływu zakupów musi być> = 0!

użyłem "new Random (). nextInt ()" do wygenerowania losowego requestCode i czasami to działało, czasami nie. teraz dowiedziałem się w poniższej dokumentacji, że requestCode nie powinien być liczbą ujemną:

http://developer.android.com/reference/android/app/Activity.html#startActivityForResult%28android.content.Intent,%20int%29

drwuro
źródło
3

Miałem ten sam problem i onActivityResult też nie został wywołany.
Zainspirowany odpowiedzią @ Ghulama zdałem sobie sprawę, że aktywność onActivityResult nie wywołuje automatycznie onActivityResult fragmentu, więc musiałem to zrobić ręcznie.

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(mCurrentFragment!= null){
            mCurrentFragment.onActivityResult(requestCode, resultCode, data);
        }
    }
Abdelalim Hassouna
źródło
W moim przypadku ta odpowiedź zadziałała, ale musiałem dodać zastąpienie OnActivityResult w mojej głównej aktywności ( github.com/onepf/OpenIAB/issues/166 )
PayToPwn
1

Musisz wywołać chronione void onActivityResult (); W Twojej aktywności rodzica zamiast w MainActivity (Trivial Drive), skąd dzwonisz do swojej MainActivity, czyli Trivial Drive Activity.

otrzymasz wartości kodu wyniku -1, jeśli zakup się powiedzie, w przeciwnym razie 0.

Programista aplikacji mobilnych
źródło
0

Miałem do czynienia z tym samym problemem i zaakceptowane rozwiązanie zostało już wdrożone, ale nie mogłem powiedzieć, co go powoduje. Przejście do nowej biblioteki rozliczeń Google Play 1.0 (wydanej 19 września 2017 r.) Rozwiązało ten problem!

Mam nadzieję, że poniższe linki pomogą komuś, kto chciałby wdrożyć nową bibliotekę:

Wpis na blogu Google dotyczący wydania

Film Google na youtube

Play Billing Library Training Class

Próbka Google Trivial Drive v2

Play Billing Library codelab opublikowana podczas konferencji Google I / O 2017

Play Billing Library Docs

Oficjalne odniesienie do klas i metod

Publikuje notatki

Mohit Singh
źródło