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:
- ¿Cómo incluir una viñeta en la descripción de la aplicación de Google Play?
- La aplicación no es compatible con la tableta
- En la aplicación de facturación v3 cuando no hay red
- Cómo publicar la aplicación de Google Play en un momento específico
- ¿Por qué obtengo esta sugerencia de optimización de Google Play?
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.
- Nexus 7 Soporte para Android Application Manifest Assembly
- La aplicación es incompatible con todos los dispositivos después de publicar en el mercado, pero funcionaba cuando se trasladaba directamente al dispositivo
- ¿Has pagado la aplicación de Android gratis durante una semana?
- Implementación de X509TrustManager de tela / crashlytics inseguro?
- ¿Cómo puedo detectar si se utiliza una aplicación de Android en Corea?
- Problema de compatibilidad de dispositivos en Play Store
- No se puede actualizar la aplicación en la tienda debido a la api23 de destino (no es posible la degradación)
- Equivalente al generador rss.itunes de Google Play
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.