Facturación en la aplicación: "Elementos de consulta disponibles para la compra" devuelve 0 artículos

Estoy intentando implementar la aplicación de facturación en mi aplicación.
Estoy siguiendo la implementación utilizada en la aplicación de prueba de Google TriviaDrive y la documentación pertinente en el sitio web para desarrolladores.
Mi código funciona como esperado pero cuando intento "Query Items Available for Purchase" , el objeto Inventory resultante contiene 0 objetos, aunque he creado un producto.

He creado un producto administrado con la paid_version id con la paid_version del programador de Google Play, como se muestra en la siguiente imagen: Productos en la aplicación - Captura de pantalla

La documentación indica que "Para recuperar los detalles del producto, llame a queryInventoryAsync(boolean, List, QueryInventoryFinishedListener) en su instancia IabHelper".

En mi propio código llamo
mHelper.queryInventoryAsync(true, iabItemSkus, mQueryFinishedListener)
dónde:
mHelper es mi instancia IabHelper
iabItemSkus es una Lista que contiene un único elemento con el valor "paid_version"
mQueryFinishedListener es mi oyente definido a continuación.

 IabHelper.QueryInventoryFinishedListener mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() { @Override public void onQueryInventoryFinished(IabResult result, Inventory inv) { if (result.isFailure()) { Log.d(TAG, "Querying Inventory Failed: " + result); return; } Log.d(TAG, "Title: " + inv.getSkuDetails(SKU_PAID).getTitle()); Log.d(TAG, "Description: " + inv.getSkuDetails(SKU_PAID).getDescription()); Log.d(TAG, "Price = " + inv.getSkuDetails(SKU_PAID).getPrice()); } }; 

Pero en la depuración puedo ver que el objeto de Inventory pasado atrás en el QueryInventoryFinishedListener contiene 0 elementos, por lo que las llamadas como inv.getSkuDetails(SKU_PAID).getTitle() proporcionan una excepción de puntero nulo.

No puedo averiguar a dónde me equivoco. Esperaba que el objeto Inventory paid_version los detalles de mi producto de paid_version en la aplicación.

A continuación se presentan sólo las partes de mi código y LogCat creo que son relevantes para este problema (tratando de evitar dar sobrecarga de código!), Pero si más detalles sobre alguna otra parte del código sería útil, hágamelo saber.

De mi actividad:

 ... private static final String SKU_PAID = "paid_version"; private static final String TAG = "MyActivity"; private IabHelper mHelper; ... IabHelper.QueryInventoryFinishedListener mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() { @Override public void onQueryInventoryFinished(IabResult result, Inventory inv) { if (result.isFailure()) { Log.d(TAG, "Querying Inventory Failed: " + result); return; } Log.d(TAG, "Title: " + inv.getSkuDetails(SKU_PAID).getTitle()); // <-- Line 266 of MyActivity.java Log.d(TAG, "Description: " + inv.getSkuDetails(SKU_PAID).getDescription()); Log.d(TAG, "Price = " + inv.getSkuDetails(SKU_PAID).getPrice()); } }; ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... final List<String> iabItemSkus = new ArrayList<String>(); iabItemSkus.add(SKU_PAID); // In App Billing String base64EncodedPublicKey = "... My Public Key ..."; mHelper = new IabHelper(this, base64EncodedPublicKey); mHelper.enableDebugLogging(true); mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { @Override public void onIabSetupFinished(IabResult result) { if (!result.isSuccess()) { Log.d(TAG, "Problem setting up In-app Billing: " + result); } // Have we been disposed of in the meantime? If so, quit. if (mHelper == null) return; // IAB is fully set up. Now, let's get list of available items Log.d(TAG, "Setup successful. Querying inventory."); mHelper.queryInventoryAsync(true, iabItemSkus, mQueryFinishedListener); } }); ... } 

Desde mi LogCat:

 ... 05-13 19:46:59.609 22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Starting in-app billing setup. 05-13 19:46:59.629 22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Billing service connected. 05-13 19:46:59.629 22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Checking for in-app billing 3 support. 05-13 19:46:59.629 22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper﹕ In-app billing version 3 supported for xxx.xxxxxx.xxxxxx 05-13 19:46:59.639 22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Subscriptions AVAILABLE. 05-13 19:46:59.639 22390-22390/xxx.xxxxxx.xxxxxx D/MyActivity﹕ Setup successful. Querying inventory. 05-13 19:46:59.639 22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Starting async operation: refresh inventory 05-13 19:46:59.649 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Querying owned items, item type: inapp 05-13 19:46:59.649 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Package name: xxx.xxxxxx.xxxxxx 05-13 19:46:59.649 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Calling getPurchases with continuation token: null 05-13 19:46:59.659 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Owned items response: 0 05-13 19:46:59.659 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Continuation token: null 05-13 19:46:59.659 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Querying SKU details. 05-13 19:46:59.689 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Querying owned items, item type: subs 05-13 19:46:59.689 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Package name: xxx.xxxxxx.xxxxxx 05-13 19:46:59.689 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Calling getPurchases with continuation token: null 05-13 19:46:59.699 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Owned items response: 0 05-13 19:46:59.699 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Continuation token: null 05-13 19:46:59.699 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Querying SKU details. 05-13 19:46:59.829 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper﹕ Ending async operation: refresh inventory 05-13 19:46:59.829 22390-22390/xxx.xxxxxx.xxxxxx D/AndroidRuntime﹕ Shutting down VM 05-13 19:46:59.829 22390-22390/xxx.xxxxxx.xxxxxx W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41b31ba8) 05-13 19:46:59.839 22390-22390/xxx.xxxxxx.xxxxxx E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: xxx.xxxxxx.xxxxxx, PID: 22390 java.lang.NullPointerException at xxx.xxxxxx.xxxxxx.MyActivity$1.onQueryInventoryFinished(MyActivity.java:266) at xxx.xxxxxx.xxxxxx.util.IabHelper$2$1.run(IabHelper.java:630) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method) ... 

PS: Acabo de actualizar mi código para resaltar cual es la línea 266.


Adicional

Yo estaba experimentando este problema 12 horas después de subir mi APK, y como se puede ver en el LogCat, que indica "In-app billing version 3 supported" para mi aplicación.
El problema persistió independientemente de si establecía el estado del producto IN-APP como activo o inactivo.

Ahora 24 horas más tarde magicamente decide trabajar correctamente.

De esto sólo puedo determinar que se trata de un problema con Google Play, no con mi código.

Estoy en el mismo barco. Estoy esperando a ver qué pasa.

En la documentación de google http://developer.android.com/training/in-app-billing/test-iab-app.html

Hay una advertencia, tal vez este es el problema:

Advertencia: Puede tardar hasta 2-3 horas después de cargar el APK de Google Play para reconocer la versión actualizada de APK. Si intenta probar su aplicación antes de que Google Play reconozca su APK cargado, su aplicación recibirá una respuesta de "compra cancelada" con un mensaje de error "Esta versión de la aplicación no está habilitada para la facturación en la aplicación".

Para que la facturación en la aplicación funcione, siga estos pasos:

  • Añadir <uses-permission android:name="com.android.vending.BILLING" /> a AndroidManifest.xml .
  • Cree un APK firmado y carguelo en la consola del desarrollador, como alfa, beta o producción.
  • Publique el APK o cree un grupo de google y añada una lista de probadores de alfa .
  • Tienes que esperar algunas horas para ver las compras en la aplicación en tu aplicación.

Estoy teniendo el mismo problema. Si nos fijamos en el código IabHelper, creo que el problema es el siguiente:

Dentro de queryInventory:

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

Pero entonces las primeras líneas de querySkuDetails:

 int querySkuDetails(String itemType, Inventory inv, List<String> moreSkus) throws RemoteException, JSONException { logDebug("Querying SKU details."); ArrayList<String> skuList = new ArrayList<String>(); skuList.addAll(inv.getAllOwnedSkus(itemType)); 

Observe que la última línea llena el skuList con todos los skus propios. No todos los disponibles.

Así que la respuesta es que el IabHelper realmente no apoya la consulta de compras disponibles.

Tarde para responder, yo también me encontré con el mismo problema. Después de leer toda la documentación durante 3 días, finalmente encontré al culpable.

Según la documentación :

Las aplicaciones de borrador ya no son compatibles.

Anteriormente, podría publicar una versión "borrador" de su aplicación para realizar pruebas. Esta funcionalidad ya no es compatible. En su lugar, hay dos maneras de probar cómo funciona una aplicación de pre-lanzamiento en Google Play Store:

Puede publicar una aplicación en los canales de distribución alfa o beta. Esto hace que la aplicación esté disponible en Google Play Store, pero solo para los probadores que incluyas en una "lista blanca". En algunos casos, puedes probar la funcionalidad de Google Play con una aplicación no publicada. Por ejemplo, puede probar la compatibilidad de facturación en la aplicación de una aplicación no publicada mediante el uso de respuestas estáticas, IDs de productos especiales reservados que siempre devuelven un resultado específico (como "comprado" o "reembolsado").

Google debería facilitar este proceso.

  • Localización de las cadenas de apk tanto en inglés como en inglés?
  • Actualizar la aplicación de google play mediante programación en android
  • Error al actualizar el inventario. Facturación en la aplicación
  • Procedimiento para licenciar el mercado de Android
  • App missing en el Android Market
  • Cómo cambiar la versión de Android y el número de versión de código en Android Studio?
  • Los recursos de los servicios de Google Play no se han configurado
  • Google Play (mercado) notificaciones de nuevos comentarios de calificaciones
  • Aplicación que provoca cierre de la aplicación en el Administrador de aplicaciones
  • ¿Es posible conocer la fuente (por ejemplo, Google Play) de la aplicación para Android?
  • Android: cómo distribuir la aplicación pagada cuando se paga Google Play no está disponible en mi país
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.