2017-07-06 2 views
0

Mon achat intégré à l'application fonctionne très bien. Toutefois, lorsque mes utilisateurs ne souhaitent pas l'acheter et qu'ils annulent ou quittent la "boîte de dialogue contextuelle Google Store", mon application se bloque (quitte). Je le code suivant:Lorsque l'internaute ne souhaite pas acheter de produit intégré à l'application et qu'il annule la boîte de dialogue contextuelle de la boutique Google, l'application se bloque. Pourquoi?

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

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 

     if (purchase.getSku().equals(ITEM_SKU)) { 
      Log.d(TAG, "Purchase is fast mode"); 
      try { 
       mHelper.consumeAsync(purchase, mConsumeFinishedListener); 
      } catch (Exception e) { 
       Log.d(TAG, "error"); 
      } 
     } 

    } 
}; 


IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { 
    public void onConsumeFinished(Purchase purchase, IabResult result) { 

     Log.d(TAG, "Consumption finished. JSON: " + purchase.getOriginalJson() + ", signature: " + purchase.getSignature()); 

     if (mHelper == null) return; 

     if (result.isSuccess()) { 
      Log.i(TAG, "BOUGHT THE ITEM :-)"); 
      clickButton.setEnabled(true); 
      buyButton.setEnabled(false); 
     } else { 
      Log.e(TAG, "Error while consuming: " + result); 
     } 
     Log.d(TAG, "End consumption flow."); 
    } 
}; 
+0

S'il vous plaît signaler vos erreurs logcat lorsque l'application se bloque. – DaveNOTDavid

+0

Pour l'instant, je n'ai pas de périphérique physique pour le tester. Aucune suggestion? –

+0

Eh bien, même pour les émulateurs, il devrait y avoir quelques erreurs après le plantage de l'application. Avez-vous vérifié votre logcat IDE dans le moniteur Android? – DaveNOTDavid

Répondre

1

Le problème réside dans l'interface OnIabPurchaseFinishedListener puisque c'est ce que lorsque le dialogue d'achat s'ouvre, et vous devez vous assurer de sortir de la méthode immédiatement lorsque le processus est annulé depuis Il n'y a pas de SKU pour vérifier les achats qui mènent probablement à un NullPointerException. Cela dit, j'ajouterais des méthodes de validation (comme vous l'avez fait dans votre écouteur consommé fini) dans l'interface comme suit:

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 

     // If we were disposed of in the meantime, exits out of the method. 
     if (mHelper == null) return; 

     // If purchase was cancelled, exits out of the method. 
     if (result.isFailure()) { 
      Log.d(TAG, "Error purchasing: " + result); 
      return; 
     } 

     // If user authentication is invalid, exits out of the method. 
     if (!verifyDeveloperPayload(purchase)) { 
      Log.d(TAG, "Error purchasing. Authenticity verification failed."); 
      return; 
     } 

     // Only then if all of the validation conditions are met will the following be executed. 
     if (purchase.getSku().equals(ITEM_SKU)) { 
      Log.d(TAG, "Purchase is fast mode"); 
      try { 
       mHelper.consumeAsync(purchase, mConsumeFinishedListener); 
      } catch (Exception e) { 
       Log.d(TAG, "error"); 
      } 
     } 

    } 
}; 
+0

Maintenant, cela a fonctionné, cependant, il n'a pas exécuté mon code dans l'écouteur terminé –

+0

@IriskulTurduev Que voulez-vous dire? Quel code n'a pas fonctionné dans l'auditeur? Cela devrait être testé sur un périphérique physique btw. – DaveNOTDavid

+1

Merci pour l'aide, j'ai ajouté ce code si (achat == null) retour; Maintenant, il ne quitte pas –