2013-03-17 13 views
51

modifica 4/15: Il rilevamento di nullpointer in IabHelper sembra aver interrotto questo problema. Non vedo più le eccezioni lanciate, lo accetterò come risposta.API di fatturazione v3 IabHelper NullPointerException


modificare 4/04: Un po 'di un'immersione più profonda. Esistono blocchi catch catch che gestiscono RemoteExceptions e JSONExceptions per il metodo queryPurchases, ma nessuna gestione NullPointerException. Quello che ho intenzione di provare è includere La gestione delle eccezioni NullPointer così IabHelper assomiglia a questo quando si cerca di querySkuDetails:

catch (NullPointerException e) { 
     throw new IabException(IABHELPER_UNKNOWN_ERROR, "NullPointer while refreshing inventory.", e); 
    } 

Ho appena depositato un bug su questo:

https://code.google.com/p/marketbilling/issues/detail?id=114


modifica 3/25: beh, continuando a ricevere questo crash ... ora capita mentre provo a ottenere un contesto alla riga 3 del seguente estratto da IabHelper:

Questo è frustrante perché nel mio manifest uso sempre il nome completo del percorso della mia app per "nome".

Esempio "com.myappname.blah.ClassName"

ho provato anche passare questo, MyClass.this, getApplicationContext() per mHelper. Tuttavia producono tutti gli stessi risultati di NullPointer casualmente dai dispositivi in ​​natura. Ho anche provato name = ". MyClass" nel manifest. Questo è ciò che sembra attualmente:

mHelper = new IabHelper(MyClass.this, myKey); 

modificare 3/18/13: sto ancora ricevendo eccezioni, anche con la nuova versione IabHelper distribuito su 3/17.

Sto iniziando a vedere uno schema qui, che gli arresti anomali sono tutti quando si cerca di ottenere un contesto quando si esegue mContext.getPackageName(). Sono curioso del motivo per cui questo funziona su tutti i miei dispositivi di test, e non riesco a riprodurre questo crash, e sembra solo essere su un piccolo numero di dispositivi.

Ecco il nuovo incidente:

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) 

Causato da IabHelper ...

line 836: logDebug("Package name: " + mContext.getPackageName()); 

modificare 3/17/13: vedo che ci sono stati molti bug correzioni pubblicate negli ultimi mesi, proverò l'ultimo codice disponibile qui e vedere se questo risolve il problema:

https://code.google.com/p/marketbilling/source/browse/v3/src/com/example/android/trivialdrivesample/util


In una delle mie applicazioni, sto usando l'API di fatturazione e il codice standard incluso con esso.

Sto utilizzando l'ultima versione dell'API di fatturazione disponibile tramite il gestore SDK a partire dal 16/03/2013.

Nella mia attività, interrogo l'inventario utilizzando il seguente:

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

Sto ricevendo più rapporti NullPointerException in natura dalla classe IabHelper per i seguenti dispositivi. Non riesco a riprodurre il problema e non riesco a trovare alcuna informazione su questi arresti anomali, ed è il motivo per cui sto postando questa domanda.

Ho innumerevoli altri controlli per null e try/catch blocchi nella parte "developer facing" dell'API di fatturazione, compreso all'interno di onQueryInventoryFinished, quindi so che questa eccezione non viene generata da "my code" (perché I ' m non catturare arresti anomali da nessuna delle mie classi dell'app), ma viene invece generato da IabHelper stesso. Non ho modificato l'IabHelper diverso da questa correzione Raccomandato: https://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) 

Causato da 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) 

Causato da IabHelper ...

line 735: Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(), ITEM_TYPE_INAPP, continueToken); 
+0

Sto ottenendo il seguente registro di arresto anomalo. 'java.lang.NullPointerException su com.myapp.util.IabHelper.queryPurchases (SourceFile: 735) su com.myapp.util.IabHelper.queryInventory (SourceFile: 465) su com.myapp.util.IabHelper $ 2.run (SourceFile: 521) a java.lang.Thread.run (Thread.java:1019) 'Qualcuno ha capito che cosa potrebbe causare questo. Sto verificando se la connessione viene stabilita prima di effettuare una query sugli acquisti. – glo

+0

Sto vedendo la stessa cosa ancora, anche con l'ultimo codice di un paio di settimane fa. È molto frustrante, ma sembra essere correlato ai contesti. Ho provato diversi modi di passare il contesto a IabHelper, ma sembrano tutti bloccarsi. Nella mia ultima versione ho commentato la riga di log che lanciava l'eccezione, ma ora si sta bloccando in un altro posto. – logray

+0

@ glo Ho appena presentato un bug su questo: https://code.google.com/p/marketbilling/issues/detail?id=114 – logray

risposta

23

modificare 4/15: Facendo nullpointer in IabHelper sembra essersi fermato questo problema. Non vedo più le eccezioni lanciate, lo accetterò come risposta.


modificare 4/04: Un po 'di un'immersione più profonda. Esistono blocchi catch catch che gestiscono RemoteExceptions e JSONExceptions per il metodo queryPurchases, ma nessuna gestione NullPointerException. Quello che ho intenzione di provare è includere La gestione delle eccezioni NullPointer così IabHelper assomiglia a questo quando si cerca di querySkuDetails:

catch (NullPointerException e) { 
     throw new IabException(IABHELPER_UNKNOWN_ERROR, "NullPointer while refreshing inventory.", e); 
    } 

Ho appena depositato un bug su questo:

https://code.google.com/p/marketbilling/issues/detail?id=114


Change

 if (querySkuDetails) { 
      r = querySkuDetails(ITEM_TYPE_INAPP, inv, moreItemSkus); 
      if (r != BILLING_RESPONSE_RESULT_OK) { 
       throw new IabException(r, "Error refreshing inventory (querying prices of items)."); 
      } 
     } 

a

 if (querySkuDetails) { 
      try { 
       r = querySkuDetails(ITEM_TYPE_INAPP, inv, moreItemSkus); 
       if (r != BILLING_RESPONSE_RESULT_OK) { 
        throw new IabException(r, "Error refreshing inventory (querying prices of items)."); 
       } 
      } catch (NullPointerException e) { 
       throw new IabException(IABHELPER_UNKNOWN_ERROR, "NPE while refreshing inventory.", e); 
      } 
     } 

Change

  if (querySkuDetails) { 
       r = querySkuDetails(ITEM_TYPE_SUBS, inv, moreSubsSkus); 
       if (r != BILLING_RESPONSE_RESULT_OK) { 
        throw new IabException(r, "Error refreshing inventory (querying prices of subscriptions)."); 
       } 
      } 

a

  if (querySkuDetails) { 
       try { 
        r = querySkuDetails(ITEM_TYPE_SUBS, inv, moreSubsSkus); 
        if (r != BILLING_RESPONSE_RESULT_OK) { 
         throw new IabException(r, "Error refreshing inventory (querying prices of subscriptions)."); 
        } 
       } catch (NullPointerException e) { 
        throw new IabException(IABHELPER_UNKNOWN_ERROR, "NPE while refreshing inventory.", e); 
       } 
      } 
+0

L'archiviazione di un bug potrebbe non essere utile, poiché il repository è deprecato. –

+1

dove dovrei mettere questo fermo? –

20

Probabilmente si sta utilizzando le operazioni asincrone.L'attuale IabHelper non è sicuro nel caso si utilizzino i ... metodi asincroni. Il problema è che in qualsiasi momento è in esecuzione un'operazione asincrona può essere chiamato sul thread principale. In questo caso otterrai NullPointerExceptions e IllegalStateExceptions.

Ecco la patch fissandola:

Index: src/com/evotegra/aCoDriver/iabUtil/IabHelper.java 
=================================================================== 
--- src/com/evotegra/aCoDriver/iabUtil/IabHelper.java (revision 1162) 
+++ src/com/evotegra/aCoDriver/iabUtil/IabHelper.java (working copy) 
@@ -86,7 +86,10 @@ 

    // Is an asynchronous operation in progress? 
    // (only one at a time can be in progress) 
- boolean mAsyncInProgress = false; 
+ volatile boolean mAsyncInProgress = false; 
+  
+ // is set to true if dispose is called while a thread is running. Allows graceful shutdown 
+ volatile boolean mDisposeRequested = false; 

    // (for logging/debugging) 
    // if mAsyncInProgress == true, what asynchronous operation is in progress? 
@@ -285,6 +288,12 @@ 
     * disposed of, it can't be used again. 
     */ 
    public void dispose() { 
+  // do not dispose while an async Thread is running. Will cause all kinds of exceptions. 
+  // In this case dispose must be called from thread after setting mAsyncInProgress to true 
+  if (mAsyncInProgress) { 
+   mDisposeRequested = true; 
+   return; 
+  } 
     logDebug("Disposing."); 
     mSetupDone = false; 
     if (mServiceConn != null) { 
@@ -827,6 +836,7 @@ 
     logDebug("Ending async operation: " + mAsyncOperation); 
     mAsyncOperation = ""; 
     mAsyncInProgress = false; 
+  if (mDisposeRequested) IabHelper.this.dispose(); 
    } 

oppure scaricare la patch qui. http://code.google.com/p/marketbilling/issues/detail?id=139&thanks=139&ts=1375614409

+0

Uso un executor a thread singolo per pianificare successivamente tutte le operazioni asincrone. Anche il metodo di smaltimento. Vedi anche http://stackoverflow.com/questions/16222015/in-app-billing-v3-illegalargumentexception-using-iabhelper. –

+4

Sfortunatamente l'IabHelper ha diversi altri difetti. In generale non è pronto per la produzione e imo dovrebbe ** not ** essere utilizzato in qualsiasi app pubblica. Ho informato il proprietario del codice su [email protected] Ho ricevuto anche una risposta che diceva "Lo sviluppatore mi ha detto che è stato risolto nella versione attuale", ma in realtà non lo è. Forse gli scrivi un'email per chiedere gentilmente di aggiustarlo. – tmanthey

+0

Questa patch risolve * questo * bug o no? – l33t

-1

Se si riceve questo errore sull'emulatore, può essere una cosa molto semplice che accade in più di un mezzo caso.

Verifica di utilizzare l'SDK dell'API di Google e non l'SDK normale !!!

0

modificare leggermente l'inizio del metodo queryPurchases a guardare come questo:

int queryPurchases(Inventory inv, String itemType) throws JSONException, RemoteException { 
     // Query purchases 
     //logDebug("Querying owned items, item type: " + itemType); 
     //logDebug("Package name: " + mContext.getPackageName()); 
     boolean verificationFailed = false; 
     String continueToken = null; 

     do { 
//   logDebug("Calling getPurchases with continuation token: " + continueToken); 
      if(mDisposed || mService==null) return IABHELPER_UNKNOWN_ERROR; 
      Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(), 
        itemType, continueToken); 

Grazie a sebastie per sottolineare la causa di questo.

0

tmantheypatch richiede anche

mDisposeRequested = false; 

dopo il disporsi si è svolto

Problemi correlati