android android-intent in-app-billing illegalargumentexception android-5.0-lollipop

Facturación In-App de Google, IllegalArgumentException: la intención del servicio debe ser explícita, después de actualizar a Android L Dev Preview



android-intent in-app-billing (10)

Mi código de facturación en la aplicación funcionaba bien hasta que me actualicé a Android L Dev Preview. Ahora recibo este error cuando se inicia mi aplicación. ¿Alguien sabe qué ha cambiado en L que causa esto o cómo debería cambiar mi código para solucionarlo?

android { compileSdkVersion ''android-L'' buildToolsVersion ''20'' defaultConfig { minSdkVersion 13 targetSdkVersion ''L'' ... ... compile ''com.google.android.gms:play-services:5.+'' compile ''com.android.support:support-v13:21.+'' compile ''com.android.support:appcompat-v7:21.+'' ... ...

El error cuando la aplicación comienza:

06-29 16:22:33.281 5719-5719/com.tbse.wnswfree D/AndroidRuntime﹕ Shutting down VM 06-29 16:22:33.284 5719-5719/com.tbse.wnswfree E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.tbse.wnswfree, PID: 5719 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tbse.wnswfree/com.tbse.wnswfree.InfoPanel}: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.android.vending.billing.InAppBillingService.BIND } at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2255) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2317) at android.app.ActivityThread.access$800(ActivityThread.java:143) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5070) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:631) Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.android.vending.billing.InAppBillingService.BIND } at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1603) at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1702) at android.app.ContextImpl.bindService(ContextImpl.java:1680) at android.content.ContextWrapper.bindService(ContextWrapper.java:528) at com.tbse.wnswfree.util.IabHelper.startSetup(IabHelper.java:262) at com.tbse.wnswfree.InfoPanel.onStart(InfoPanel.java:709) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1217) at android.app.Activity.performStart( Activity.java:5736) at android.app.ActivityThread.performLaunchActivity( ActivityThread.java:2218) at android.app.ActivityThread.handleLaunchActivity( ActivityThread.java:2317) at android.app.ActivityThread.access$800( ActivityThread.java:143) at android.app.ActivityThread$H.handleMessage( ActivityThread.java:1258) ...

Línea 709 en InfoPanel.java:

mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { @Override public void onIabSetupFinished(IabResult result) { ...



Esto funcionó para mí, pero me gustaría saber si es una forma aceptable de hacerlo:

i.setClass (context, MyService.class);


Las respuestas a estos problemas específicos ya se han publicado, pero solo para ayudar a otras personas con exactamente el mismo problema, pero esta vez para la API de la licencia.

Obtiene el mismo error en el mensaje 5.0 que en la biblioteca IAP publicada anteriormente, pero puede encontrar una solución (que implica cambiar manualmente algunas líneas en LicenseChecker.java (código de Google) y luego recompilar su proyecto que incluirá esta biblioteca).

Consulte: https://code.google.com/p/android/issues/detail?id=78505 para obtener más información. Espero que cualquiera pueda usarlo.


Para mí, funcionó utilizar el IabHelper actual de las muestras: sdk / extras / google / play_billing / samples / TrivialDrive / src / com / example / android / trivialdrivesample / util / IabHelper.java

No olvide ejecutar primero el administrador de actualizaciones de SDK para asegurarse de tener instalada la versión actual.


Recibí el mismo error del código de configuración anterior de Google Cloud Messaging. La solución más simple parece estar cambiando

Intent registrationIntent = new Intent( "com.google.android.c2dm.intent.REGISTER");

dentro

Intent registrationIntent = new Intent(); registrationIntent.setClassName("com.google.android.c2dm.intent", "REGISTER");


Se encontró una solución clara aquí: https://code.google.com/p/android-developer-preview/issues/detail?id=1674

En Google Licensing Library (LVL), archivo LicenseChecker.java, reemplace la llamada "bindService" por esta:

Intent serviceIntent = new Intent( new String(Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U="))); serviceIntent.setPackage("com.android.vending"); boolean bindResult = mContext .bindService( serviceIntent, this, // ServiceConnection. Context.BIND_AUTO_CREATE);

Y en el conjunto AndroidManifest.xml: android: minSdkVersion = "4"

El "setPackage" requiere Android versión 4.


Simplemente reemplace el código

boolean attempt = mContext.bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);

con el siguiente código

Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND"); serviceIntent.setPackage("com.android.vending"); boolean attempt = mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);

en la clase IabHelper que ha colocado en la carpeta de utilidades de la aplicación (si ha seguido las instrucciones del tutorial de facturación de Google InApp).


Tuve el mismo problema y establecer explícitamente el paquete lo resolvió. Similar a la respuesta de Aleksey, pero más simple:

Intent intent = new Intent("com.android.vending.billing.InAppBillingService.BIND"); // This is the key line that fixed everything for me intent.setPackage("com.android.vending"); getContext().bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);


si tiene el siguiente error, establezca targetSdkVersion 19 en build.gradle. Cuando configuré el 19 mi problema fue resuelto. Para publicación, configuré targetSdkVersion 27

en com.google.android.vending.licensing.LicenseChecker.checkAccess (LicenseChecker.java:150) en com.google.android.vending.expansion.downloader.impl.DownloaderService $ LVLRunnable.run

defaultConfig { applicationId "com.brain.math.game.free" minSdkVersion 15 targetSdkVersion 19

targetSdkVersion 19


Como se señala en la respuesta a continuación, las soluciones serían crear intenciones explícitas de forma manual:

private Intent getExplicitIapIntent() { PackageManager pm = mContext.getPackageManager(); Intent implicitIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND"); List<ResolveInfo> resolveInfos = pm.queryIntentServices(implicitIntent, 0); // Is somebody else trying to intercept our IAP call? if (resolveInfos == null || resolveInfos.size() != 1) { return null; } ResolveInfo serviceInfo = resolveInfos.get(0); String packageName = serviceInfo.serviceInfo.packageName; String className = serviceInfo.serviceInfo.name; ComponentName component = new ComponentName(packageName, className); Intent iapIntent = new Intent(); iapIntent.setComponent(component); return iapIntent; }

Here está el código en las fuentes de vista previa L para comprobar el intento explícito. Se ha commented actualmente, pero en Nexus 5 con vista previa L todavía se ejecuta y arroja una excepción para los intentos implícitos.


Editar: la answer de @Alav es mucho mejor y más simple. Solo agrega

intent.setPackage("com.android.vending");

Todos los créditos para answer . Y here está el código en las fuentes de liberación L para comprobar el intento explícito.