edit 4/15 : La capture de nullpointer dans IabHelper semble avoir mis fin à ce problème. Je ne vois plus les exceptions lancées, je vais accepter cela comme une réponse.
edit 4/04 : Un peu plus loin dans le détail. Il y a des blocs try catch qui gèrent les RemoteExceptions et les JSONExceptions pour la méthode queryPurchases, mais pas de gestion des NullPointerExceptions. Ce que je vais essayer de faire, c'est d'inclure la gestion des exceptions NullPointer afin que l'IabHelper ressemble à ceci lorsqu'il essaie d'interroger la méthode querySkuDetails :
catch (NullPointerException e) {
throw new IabException(IABHELPER_UNKNOWN_ERROR, "NullPointer while refreshing inventory.", e);
}
Je viens de déposer un bug à ce sujet :
https://code.google.com/p/marketbilling/issues/detail?id=114
edit 3/25 : Eh bien, je reçois toujours ce plantage... maintenant il se produit en essayant d'obtenir un contexte à la ligne 3 de l'extrait suivant de IabHelper :
int queryPurchases(Inventory inv, String itemType) throws JSONException, RemoteException {
logDebug("Querying owned items, item type: " + itemType);
logDebug("Package name: " + mContext.getPackageName());
C'est frustrant car dans mon manifeste, j'utilise toujours le nom complet du chemin d'accès de mon application pour "nom".
Exemple "com.myappname.blah.ClassName"
J'ai également essayé de passer ceci, MyClass.this, getApplicationContext() à mHelper. Cependant, ils produisent tous les mêmes résultats NullPointer au hasard des appareils dans la nature. J'ai également essayé de nommer ".MyClass" dans le manifeste. Voici à quoi cela ressemble actuellement :
mHelper = new IabHelper(MyClass.this, myKey);
modifier 18/03/13 : Je reçois toujours des exceptions, même avec la nouvelle version de IabHelper déployée le 17/03.
Je commence à voir un modèle ici, que les pannes sont toutes en essayant d'obtenir un contexte lors de l'exécution de mContext.getPackageName(). Je suis curieux de savoir pourquoi cela fonctionne sur tous mes appareils de test, alors que je n'arrive pas à reproduire ce plantage, qui ne semble concerner qu'un petit nombre d'appareils.
Voici le nouveau crash :
java.lang.NullPointerException
at com.myapp.util.IabHelper.queryPurchases(SourceFile:836)
at com.myapp.util.IabHelper.queryInventory(SourceFile:558)
at com.myapp.util.IabHelper.queryInventory(SourceFile:522)
at com.myapp.util.IabHelper$2.run(SourceFile:617)
at java.lang.Thread.run(Thread.java:1019)
Causé par IabHelper...
line 836: logDebug("Package name: " + mContext.getPackageName());
modifier 3/17/13 : Je vois qu'il y a eu de nombreuses corrections de bugs publiées au cours des derniers mois, je vais essayer le dernier code disponible ici et voir si cela résout le problème :
Dans l'une de mes applications, j'utilise l'API de facturation et le code passe-partout qui l'accompagne.
J'utilise la dernière version de l'API de facturation disponible via le gestionnaire de SDK à la date du 16 mars 2013.
Dans mon activité, j'interroge l'inventaire en utilisant ce qui suit :
final List<String> skuList = new ArrayList<String>();
skuList.add("sku1");
skuList.add("sku2");
skuList.add("sku3");
if (skuList != null) {
if (skuList.size() > 0) {
try {
mHelper.queryInventoryAsync(true, skuList, mGotInventoryListener);
} catch (Exception e) {
ACRA.getErrorReporter().handleException(e);
}
}
}
Je reçois plusieurs rapports NullPointerException dans la nature de la classe IabHelper pour les dispositifs suivants. Je n'arrive pas à reproduire le problème et je ne trouve aucune information concernant ces pannes. C'est la raison pour laquelle je poste cette question.
Je dispose d'un nombre incalculable d'autres vérifications des nuls et des blocs try/catch dans la partie de l'API de facturation qui s'adresse aux développeurs, y compris dans onQueryInventoryFinished. Je sais donc que cette exception n'est pas levée depuis "mon code" (car je ne capture pas les plantages dans les classes de mon application), mais qu'elle est levée depuis l'IabHelper lui-même. Je n'ai pas modifié l'IabHelper en dehors de cette correction recommandée : http://stackoverflow.com/a/14737699
Crash #1 Galaxy Nexus
java.lang.NullPointerException
at com.myapp.util.IabHelper.querySkuDetails(SourceFile:802)
at com.myapp.util.IabHelper.queryInventory(SourceFile:471)
at com.myapp.util.IabHelper$2.run(SourceFile:521)
at java.lang.Thread.run(Thread.java:856)
Causé par IabHelper...
line 802: Bundle skuDetails = mService.getSkuDetails(3, mContext.getPackageName(), ITEM_TYPE_INAPP, querySkus);
Crash #2 Samsung GT-S5570L
java.lang.NullPointerException
at com.myapp.util.IabHelper.queryPurchases(SourceFile:735)
at com.myapp.util.IabHelper.queryInventory(SourceFile:465)
at com.myapp.util.IabHelper$2.run(SourceFile:521)
at java.lang.Thread.run(Thread.java:1019)
Causé par IabHelper...
line 735: Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(), ITEM_TYPE_INAPP, continueToken);