test studio purchase pay library error compras app android in-app-billing

android - studio - pay app billing



Factura de API v3 IabHelper NullPointerException (6)

edit 15/04: Capturar nullpointer en IabHelper parece haber detenido este problema. Ya no veo las excepciones lanzadas, voy a aceptar esto como una respuesta.

edit 4/04: Una inmersión más profunda. Hay try catch blocks que manejan RemoteExceptions y JSONExceptions para el método queryPurchases, pero no para el manejo de NullPointerException. Lo que voy a intentar es incluir el manejo de Excepción de NullPointer para que IabHelper se vea así al intentar consultar los DetallesSku:

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

Acabo de archivar un error en esto:

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

edit 3/25: bueno, sigue recibiendo este bloqueo ... ahora sucede mientras trato de obtener un contexto en la línea 3 del siguiente fragmento de IabHelper:

int queryPurchases(Inventory inv, String itemType) throws JSONException, RemoteException { logDebug("Querying owned items, item type: " + itemType); logDebug("Package name: " + mContext.getPackageName());

Esto es frustrante porque en mi manifiesto siempre utilizo el nombre de ruta completo de mi aplicación para "nombre".

Ejemplo "com.myappname.blah.ClassName"

También he intentado pasar esto, MyClass.this, getApplicationContext () a mHelper. Sin embargo, todos producen los mismos resultados de NullPointer al azar de dispositivos en la naturaleza. También probé name = ". MyClass" en el manifiesto. Esto es lo que parece actualmente:

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

edit 18/03/13: Todavía recibo excepciones, incluso con la nueva versión de IabHelper implementada el 3/17.

Estoy empezando a ver un patrón aquí, que los bloqueos son todos cuando trato de obtener un contexto al ejecutar mContext.getPackageName (). Tengo curiosidad de por qué esto funciona en todos mis dispositivos de prueba, y no puedo reproducir este bloqueo, y solo parece estar en una pequeña cantidad de dispositivos.

Aquí está el nuevo choque:

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)

Causado por IabHelper ...

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

edit 17/03/13: Veo que se han corregido muchas fallas en los últimos meses, voy a probar el último código disponible aquí y ver si esto resuelve el problema:

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

En una de mis aplicaciones, estoy usando la API de facturación y el código repetitivo incluido con ella.

Estoy usando la última versión de la API de facturación disponible a través del administrador de SDK desde el 3/16/2013.

En mi actividad, consulto el inventario usando lo siguiente:

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

Recibo múltiples informes NullPointerException en estado salvaje de la clase IabHelper para los siguientes dispositivos. No puedo reproducir el problema y no puedo encontrar información sobre estos bloqueos, y es la razón por la que estoy publicando esta pregunta.

Tengo un sinnúmero de otras comprobaciones de nulos y bloqueos try / catch en la parte de "desarrollador hacia" de la API de facturación, incluso en onQueryInventoryFinished, así que sé que esta excepción no se está lanzando desde "mi código" (porque no estoy capturando fallas de cualquiera de las clases de mi aplicación), pero en su lugar se está lanzando desde el propio IabHelper. No he modificado el IabHelper aparte de esta solución recomendada: https://stackoverflow.com/a/14737699

Accidente # 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)

Causado por 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)

Causado por IabHelper ...

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



Modifique ligeramente el comienzo del método queryPurchases para que se vea así:

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

Gracias a sebastie por señalar la causa de esto.


Probablemente estés usando operaciones asincrónicas. El IabHelper actual no es seguro en caso de que utilice los ... métodos asincrónicos. El problema es que en cualquier momento que se está ejecutando una operación asíncrona, se puede invocar a disponer en el hilo principal. En este caso, obtendrá NullPointerExceptions y IllegalStateExceptions.

Aquí está el parche que lo arregla:

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

O descarga el parche aquí. http://code.google.com/p/marketbilling/issues/detail?id=139&thanks=139&ts=1375614409


Si obtiene este error en el emulador, puede ser algo muy simple que ocurre en más de la mitad de los casos.

¡¡¡Compruebe que está utilizando Google API SDK y no SDK normal !!!



edit 15/04: Capturar nullpointer en IabHelper parece haber detenido este problema. Ya no veo las excepciones lanzadas, voy a aceptar esto como una respuesta.

edit 4/04: Una inmersión más profunda. Hay try catch blocks que manejan RemoteExceptions y JSONExceptions para el método queryPurchases, pero no para el manejo de NullPointerException. Lo que voy a intentar es incluir el manejo de Excepción de NullPointer para que IabHelper se vea así al intentar consultar los DetallesSku:

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

Acabo de archivar un error en esto:

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

Cambio

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

Cambio

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