onIabPurchaseFinished n'a jamais été appelé.


111

J'ai essayé de configurer la facturation via l'application pour ma première application et j'utilise le sku android.test.purchased. L'achat est effectué et j'arrive à insérer le SKU dans mon inventaire, mais, comme le titre l'indique, onIabPurchaseFinished, n'est jamais appelé.

Je pense que cela peut avoir quelque chose à voir avec ce journal: "Impossible d'enregistrer quelle vue a le focus car la vue focalisée com.android.internal.policy.impl.PhoneWindow$DecorView@406743d0 n'a pas d'identifiant". Cela apparaît juste avant de passer à Google Play. Je ne suis pas vraiment sûr de ce que cela signifie cependant ...

Lancement de l'achat:

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

Et l'auditeur:

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


    }
};

Je devrais peut-être ajouter que j'essaie de le faire à partir d'un onglet
AAAton

J'ai défini l'identifiant par programme, mais aucune différence.
AAAton

Réponses:


206

Essayez d'ajouter ceci à l'activité qui appelle 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.");
    }
}

16
eu le même problème et cela a fonctionné parfaitement. Mais ce que je veux savoir, c'est pourquoi le rappel n'est-il pas exécuté comme on le supposerait, pourquoi devons-nous appeler cela nous-mêmes? Un peu rend le rappel inutile: /
Spider

4
M'a également aidé, merci. @Spider, la raison pour laquelle vous avez besoin de cette méthode dans votre activité est que sinon la méthode handleActivityResult () de mHelper ne sera pas appelée. En d'autres termes, c'est le handleActivityResult () réel / standard nécessaire dans l'activité, et mHelper est en fait juste une ancienne méthode régulière.
gcl1

8
Merci pour cela. C'est un bogue dans la documentation (ils ne mentionnent jamais avoir besoin de cela ou dans IabHelper. IabHelper's launchPurchaseFlow () invoque le startIntentSenderForResult - qui appellera votre activité onActivityResult () quand elle sera terminée.
Jerry Brady

3
Je pensais avoir résolu mon problème quand j'ai trouvé cela ... puis j'ai réalisé que j'avais déjà implémenté cette fonction et que cela ne fonctionne toujours pas ... soupir
Matt K

3
Notez que la substitution de onActivityResult () sur un fragment ne fonctionne pas, cela doit être fait sur une activité
cprcrack

8

Je viens de découvrir une autre chose importante: le requestCode qui est utilisé pour lancer le flux d'achat doit être> = 0!

J'ai utilisé "new Random (). nextInt ()" pour générer un requestCode aléatoire, et parfois cela fonctionnait, parfois non. maintenant, j'ai découvert dans la documentation suivante que le requestCode ne devrait pas être un nombre négatif:

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


3

J'ai eu le même problème et onActivityResult n'a pas été appelé non plus.
Inspiré de la réponse de @ Ghulam, j'ai réalisé que l'activité onActivityResult n'appelait pas automatiquement onActivityResult du fragment, donc j'ai dû le faire manuellement.

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

Dans mon cas, cette réponse a fonctionné, mais j'ai dû ajouter un remplacement OnActivityResult dans mon activité principale ( github.com/onepf/OpenIAB/issues/166 )
PayToPwn

1

Vous devez appeler protected void onActivityResult (); Dans votre activité parentale au lieu de MainActivity (Trivial Drive) d'où vous appelez votre MainActivity qui est Trivial Drive Activity.

vous recevrez les valeurs de code de résultat -1 si l'achat réussit sinon 0.


0

J'étais confronté au même problème et la solution acceptée était déjà mise en œuvre mais je ne pouvais pas dire ce qui en était la cause. Le passage à la nouvelle bibliothèque de facturation Google Play 1.0 (publiée le 19 septembre 2017) a résolu le problème pour moi!

J'espère que les liens suivants aideront quelqu'un qui voudrait implémenter la nouvelle bibliothèque:

Article de blog de Google sur la sortie

Vidéo YouTube de Google

Cours de formation Play Billing Library

Exemple de Google Trivial Drive v2

Atelier de codage Play Billing Library publié pendant Google I / O 2017

Lire la documentation de la bibliothèque de facturation

Référence officielle des classes et méthodes

Notes de sortie

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.