onIabPurchaseFinished wurde nie aufgerufen.

111

Ich habe versucht, die In-App-Abrechnung für meine erste App einzurichten, und habe den Sku android.test.purchased verwendet. Der Kauf kommt zustande und ich schaffe es, die SKU in mein Inventar aufzunehmen, aber wie der Titel schon sagt, wird onIabPurchaseFinished nie aufgerufen.

Ich denke, es hat möglicherweise etwas mit diesem Protokoll zu tun: "Konnte nicht speichern, welche Ansicht den Fokus hat, da die fokussierte Ansicht com.android.internal.policy.impl.PhoneWindow$DecorView@406743d0 keine ID hat". Das wird angezeigt, kurz bevor Sie zu Google Play wechseln. Ich bin mir nicht sicher, was das bedeutet ...

Kauf starten:

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

Und der Zuhörer:

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
quelle
Ich sollte vielleicht hinzufügen, dass ich versuche, dies aus einem Tab heraus zu tun
AAAton
Ich habe die ID programmgesteuert festgelegt, aber keinen Unterschied.
AAAton

Antworten:

206

Fügen Sie dies der Aktivität hinzu, die Folgendes aufruft 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.");
    }
}
fehlerhaft
quelle
16
hatte das gleiche Problem und das funktionierte perfekt. Aber was ich wissen möchte ist, warum der Rückruf nicht so ausgeführt wird, wie man annehmen würde, warum müssen wir den Rückruf selbst machen? Art macht den Rückruf nutzlos: /
Spider
4
Hat mir auch geholfen, danke. @Spider, der Grund, warum Sie diese Methode in Ihrer Aktivität benötigen, ist, dass die handleActivityResult () -Methode von mHelper sonst nicht aufgerufen wird. Mit anderen Worten, dies ist das Real / Standard-handleActivityResult (), das in der Aktivität benötigt wird, und mHelper's ist eigentlich nur eine normale alte Methode.
gcl1
8
Danke dafür. Es ist ein Fehler in der Dokumentation (sie erwähnen nie, dass dies benötigt wird oder in IabHelper. IabHelpers launchPurchaseFlow () ruft das startIntentSenderForResult auf, das das onActivityResult () Ihrer Aktivität aufruft, wenn es beendet ist.
Jerry Brady
3
Ich dachte, ich hätte mein Problem gelöst, als ich das fand ... dann wurde mir klar, dass ich diese Funktion bereits implementiert hatte und sie immer noch nicht funktioniert ... seufz
Matt K
3
Beachten Sie, dass das Überschreiben von onActivityResult () für ein Fragment nicht funktioniert. Es muss für eine Aktivität durchgeführt werden
cprcrack
8

Ich habe gerade eine andere wichtige Sache herausgefunden: Der requestCode, der zum Starten des Kaufflusses verwendet wird, muss> = 0 sein!

Ich habe "new Random (). nextInt ()" verwendet, um einen zufälligen requestCode zu generieren, und manchmal hat es funktioniert, manchmal nicht. Jetzt habe ich in der folgenden Dokumentation herausgefunden, dass der requestCode keine negative Zahl sein sollte:

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

drwuro
quelle
3

Ich hatte das gleiche Problem und das onActivityResult wurde auch nicht aufgerufen.
Inspiriert von @ Ghulams Antwort wurde mir klar, dass die Aktivität onActivityResult das onActivityResult des Fragments nicht automatisch aufruft , sodass ich es manuell ausführen musste.

@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
quelle
In meinem Fall funktionierte diese Antwort, aber ich musste in meiner Hauptaktivität ( github.com/onepf/OpenIAB/issues/166 )
PayToPwn
1

Sie müssen protected void onActivityResult () aufrufen. In Ihrer übergeordneten Aktivität anstelle von MainActivity (Trivial Drive), von wo aus Sie Ihre MainActivity als Trivial Drive-Aktivität aufrufen.

Sie erhalten Ergebniscode-Werte -1, wenn der Kauf erfolgreich war, andernfalls 0.

Mobile App Entwickler
quelle
0

Ich hatte das gleiche Problem und die akzeptierte Lösung wurde bereits implementiert, konnte aber nicht sagen, was dies verursachte. Der Umzug in die neue Google Play Billing Library 1.0 (veröffentlicht am 19. September 2017) hat das Problem für mich behoben!

Ich hoffe, dass folgende Links jemandem helfen, der die neue Bibliothek implementieren möchte:

Googles Blogbeitrag über die Veröffentlichung

Googles Youtube-Video

Spielen Sie die Billing Library Training Class

Beispiel für Trivial Drive v2 von Google

Spielen Sie das Codelab der Abrechnungsbibliothek ab, das während der Google I / O 2017 veröffentlicht wurde

Abrechnungsbibliotheksdokumente abspielen

Offizielle Referenz für Klassen und Methoden

Gibt Notizen frei

Mohit Singh
quelle