Cuando se desarrolla una aplicación para Android, se suele ser receloso para que no pirateen la aplicación, ya sea por no perder ingresos, o bien, simplemente para que no se nos escapen las estadísticas que se generan y tenerla bien controlada en Google Play. También es posible usar las licencias de Android para comprobar si el usuario debe tener acceso a ciertas funcionalidades de la aplicación. Sin embargo, esto puede desembocar en una IllegalArgumentException, como vamos a ver.
Para utilizar las clases que se encargan de comprobar las licencias, simplemente hay que importar al proyecto las clases que se encargan de ello y que vienen integradas en el sdk de Android. Hasta aquí todo bien, el problema viene cuando se intenta ejecutar la aplicación por primera vez en un dispositivo con Lollipop (versión > 5.0, es decir, a partir del API21). Nada más abrir la aplicación, aparece el tan temido mensaje de que la aplicación debe cerrarse, sin dar ninguna pista más.
Si se depura o se manda el error a Google Play, el error es de tipo IllegalArgumentException al comprobar licencia en Android y suele tener una pinta similar a la siguiente:
Service Intent must be explicit: Intent { act=com.android.vending.licensing.ILicensingService
Como se ve, el error radica en que la declaración de un objeto de tipo Intent debe realizarse de tipo explícito, es decir, declarando una variable para almacenarlo y no llamarlo de forma anónima, sino que sea un intent explícito. Lo curioso viene al fijarse de qué clase procede el error. Sí, es de una clase propia del sdk de Google, concretamente de com/google/android/vending/licensing/LicenseChecker.java.
Por suerte la solución es sencilla. Consiste en buscar el siguiente código:
boolean bindResult = mContext.bindService(new Intent( new String( Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U="))), this, // ServiceConnection. Context.BIND_AUTO_CREATE);
Y sustituirlo por el siguiente código, donde se ha declarado el Intent de forma explícita como requería el error.
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);
Con esto ya no debería saltar la excepción IllegalArgumentException al validar la licencia de Google.