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

Mi código de facturación en la aplicación funcionaba bien hasta que actualizé a la vista previa de Android L. Ahora obtengo este error cuando se inicia mi aplicación. ¿Alguien sabe lo que ha cambiado en L que causa esto o cómo debo 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 al iniciar la aplicación:

 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) { ... 

Tuve el mismo problema y establecer explícitamente el paquete lo solucionó. 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); 

Como se señaló en la respuesta a continuación, las soluciones serían crear intenciones explícitas manualmente:

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

Aquí está el código en L las fuentes de vista previa para comprobar la intención explícita. Se ha comentado actualmente, pero en Nexus 5 con L vista previa todavía se ejecuta y lanza excepción para intentos implícitos.

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

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

Todos los créditos para él . Y aquí está el código en L fuentes de liberación para comprobar la intención explícita.

Solución clara encontrada aquí: https://code.google.com/p/android-developer-preview/issues/detail?id=1674

En el archivo LicenseChecker.java de la biblioteca de licencias de Google (LVL), reemplace la llamada "bindService" con esto:

  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 la versión 4 de Android.

En "L" la vinculación a un servicio requiere el uso de una intención explícita.

Consulte http://commonsware.com/blog/2014/06/29/dealing-deprecations-bindservice.html

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 inappbilling (si ha seguido las instrucciones del tutorial de Google InApp Billing).

Estaba recibiendo el mismo error del antiguo código de configuración 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"); 

Para mí trabajó para utilizar el IabHelper actual de los ejemplos: sdk / extras / google / play_billing / samples / TrivialDrive / src / com / ejemplo / android / trivialdrivesample / util / IabHelper.java

No olvide ejecutar primero el gestor de actualización de sdk para asegurarse de que tiene instalada la versión actual.

Las respuestas para estos problemas específicos ya se han publicado, pero sólo para ayudar a otros con el mismo problema, pero esta vez para la API de licencia.

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

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

Esto funcionó para mí, pero me gustaría saber de que es una forma aceptable de hacer esto:

I.setClass (contexto, MyService.class);

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.