studio lollipop descargar android-5.0-lollipop illegalargumentexception

android 5.0 lollipop - lollipop - Android 5.0(L) La intención del servicio debe ser explícita en Google Analytics



api 22 android studio (11)

Como Android 5.0 (Lollipop) bindService () siempre debe invocarse con un intento explícito. Anteriormente, esta era una recomendación, pero desde Lollipop se aplica: java.lang.IllegalArgumentException: Service Intent must be explicit se lanza cada vez que se realiza una llamada a bindService() utilizando intenciones implícitas. La diferencia entre los intentos implícitos y explícitos es que el último especifica el componente para comenzar por el nombre (el nombre de clase completamente calificado). Consulte la documentación sobre los tipos de intención aquí.

El problema que está teniendo se debe a que no se actualizó a una versión más nueva de las bibliotecas de Google, que cumplen con las restricciones de Android sobre intentos implícitos al vincular un servicio en Android 5 Lollipop. Para solucionar el problema, puede actualizar la biblioteca a una versión más reciente, si está disponible, o actualizar el código de la biblioteca usted mismo y crear su proyecto con la versión modificada.

Si no hay una actualización de biblioteca adecuada en el caso general, debe modificar el código fuente (en su caso com.google.analytics.tracking.android.AnalyticsGmsCoreClient.connect() ) para llamar a intent.setPackage(packageName) antes de llamar a bindService() donde intent es el primer argumento de la llamada bindService() y packageName es el nombre del paquete que contiene el servicio que el código intenta iniciar (en su caso "com.google.android.gms.analytics").

Puede usar este código como ejemplo de cómo hacer esto: la versión actualizada de Unity de la Biblioteca de licencias de Google (LVL) que llama bindService con un intento explícito y no da como resultado IllegalArgumentException.

Otra forma de evitar el problema es reconstruir tu proyecto y las bibliotecas de google utilizando targetSDK antes de las 19. Esto hará que se ejecute sin fallar en Lollipop, pero es la opción menos segura e impide utilizar la funcionalidad SDK introducida en versiones posteriores. (para Android 5).

Mi código funcionaba en <5, pero en Android 5.0 me encuentro con un problema que no entiendo del todo.

10-23 10:18:18.945: E/AndroidRuntime(8987): java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.google.android.gms.analytics.service.START (has extras) }

Mi código funciona, incluso ahora, en 4.4.4 y abajo. Entonces, ¿qué debo hacer? Publicaré el código relativo a continuación. Además, durante mi búsqueda en Google encontré esta publicación sobre java.lang.IllegalArgumentException: Service Intent debe ser explícito con respecto a Android 5.0, pero no entiendo lo que significa.

Manifiesto

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="xxxxx.android.phone.xxxxx" android:versionCode="3" android:versionName="v1.2.4065" > <uses-sdk android:minSdkVersion="12" android:targetSdkVersion="21" /> <!-- Required for Google Analytics --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- For push notifications (GCM) --> <permission android:name="xxxxx.android.phone.xxxxx.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="xxxxx.android.phone.xxxxx.permission.C2D_MESSAGE" /> <!-- App receives GCM messages. --> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <!-- GCM connects to Google Services. --> <uses-permission android:name="android.permission.INTERNET" /> <!-- GCM requires a Google account. --> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <!-- Keeps the processor from sleeping when a message is received. --> <uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- GCM - We handle notifications differently if the app is running --> <uses-permission android:name="android.permission.GET_TASKS" /> <!-- Caching --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- The event subscribe button adds events to the calendar --> <!-- <uses-permission android:name="android.permission.WRITE_CALENDAR" /> --> <!-- <uses-permission android:name="android.permission.READ_CALENDAR" /> --> <supports-screens android:resizeable="true" android:smallScreens="false" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" /> <application android:name="xxxxx.xxxxxApplication" android:icon="@drawable/app_icon" android:label="@string/app_name" android:allowBackup="true" android:largeHeap="true" > <receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="xxxxx.android.phone.xxxxx" /> </intent-filter> <intent-filter> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="xxxxx.android.phone.xxxxx" /> </intent-filter> </receiver> <receiver android:name="xxxxx.ConnectivityReceiver" android:enabled="false" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver> <activity android:name=".SplashActivity" android:configChanges="locale|orientation" android:theme="@style/Theme.Splash" android:screenOrientation="portrait" android:noHistory="true" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:label="@string/app_name" android:theme="@style/Theme" android:windowSoftInputMode="adjustPan|stateVisible" android:name=".LoginActivity" android:configChanges="locale|orientation|screenSize" android:screenOrientation="portrait" > </activity> <activity android:name=".MainActivity" android:theme="@style/Theme" android:configChanges="locale|orientation|screenSize" android:screenOrientation="portrait" android:windowSoftInputMode="adjustPan|stateVisible" /> <activity android:name=".CountryPickerActivity" android:theme="@style/Theme.Floating" android:configChanges="locale|orientation|screenSize" android:screenOrientation="portrait" android:windowSoftInputMode="adjustPan|stateVisible" /> <activity android:name=".EventPickerActivity" android:theme="@style/Theme.Floating" android:configChanges="locale|orientation|screenSize" android:screenOrientation="portrait" android:windowSoftInputMode="adjustPan|stateVisible" /> <activity android:name=".TutorialActivity" android:theme="@style/Theme.Transparent" android:configChanges="locale|orientation|screenSize" android:screenOrientation="portrait" /> <activity android:name=".VideoPlayerActivity" android:theme="@style/Theme" android:configChanges="orientation|screenSize" /> <service android:name=".GCMIntentService" android:enabled="true" /> <meta-data android:name="com.crashlytics.ApiKey" android:value="xxxxxxxxxxxxxxxx"/> </application> </manifest>

GCMIntentService.java

public class GCMIntentService extends GCMBaseIntentService { private static final int ATTEMPTS_MAX = 3; final static boolean USE_DEV = false; final static String XXXXX = "https://xxxxx/api.php"; final static String XXXXX = "http://dev.xxxxx/api.php"; final static String SUBSCRIPTION_KEY = "xxxxxxxxxxxxxxx"; // unique per app public GCMIntentService() { super(xxxxxx.SENDER_ID); if(GCMIntentService.USE_DEV) { host = XXXXX; } else { host = XXXXX; } } ... }

** EDIT **

Cuanto más miro este tema, más creo que no está en GCMIntentService.java . Debería haber publicado mi rastro de pila antes de que sea:

10-23 13:17:08.095: E/AndroidRuntime(10560): FATAL EXCEPTION: GAThread 10-23 13:17:08.095: E/AndroidRuntime(10560): Process: xxxxx.android.phone.xxxxx, PID: 10560 10-23 13:17:08.095: E/AndroidRuntime(10560): java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.google.android.gms.analytics.service.START (has extras) } 10-23 13:17:08.095: E/AndroidRuntime(10560): at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1674) 10-23 13:17:08.095: E/AndroidRuntime(10560): at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1773) 10-23 13:17:08.095: E/AndroidRuntime(10560): at android.app.ContextImpl.bindService(ContextImpl.java:1751) 10-23 13:17:08.095: E/AndroidRuntime(10560): at android.content.ContextWrapper.bindService(ContextWrapper.java:538) 10-23 13:17:08.095: E/AndroidRuntime(10560): at com.google.analytics.tracking.android.AnalyticsGmsCoreClient.connect(AnalyticsGmsCoreClient.java:82) 10-23 13:17:08.095: E/AndroidRuntime(10560): at com.google.analytics.tracking.android.GAServiceProxy.connectToService(GAServiceProxy.java:279) 10-23 13:17:08.095: E/AndroidRuntime(10560): at com.google.analytics.tracking.android.GAServiceProxy.createService(GAServiceProxy.java:163) 10-23 13:17:08.095: E/AndroidRuntime(10560): at com.google.analytics.tracking.android.GAThread.init(GAThread.java:95) 10-23 13:17:08.095: E/AndroidRuntime(10560): at com.google.analytics.tracking.android.GAThread.run(GAThread.java:493)

Por lo tanto, intentaré ejecutar GA como intento explícito.


Esto funcionó para mí ... Esto funcionó en lollipop usando Android SDK 21.

Intent intent = new Intent(this, Class.forName(ServiceClassName.class.getName())); bindService(intent,serviceConnection, Service.BIND_AUTO_CREATE);


Esto funciona para mí:

Intent intent = new Intent(ACTION); intent.setPackage(context.getPackageName()); context.startService(intent);


Estoy trabajando en un proyecto en el que queremos permitir a los usuarios usar dispositivos más antiguos. Se me ocurrió la misma solución que la mencionada en la respuesta de Marias, sin embargo, he agregado una declaración condicional para la llamada a setPackage ya que solo está disponible en API 4 (Ice Cream Sandwich == SDK 14) y superior. Si desarrolla versiones inferiores a las que considero, no es necesario que incluya la llamada setPackage .

En la función com.google.android.vending.licensing.LicenseChecker.checkAccess(callback)

Intent serviceIntent = new Intent(new String( Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U="))); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { serviceIntent.setPackage("com.android.vending"); } boolean bindResult = mContext.bindService( serviceIntent, this, // ServiceConnection. Context.BIND_AUTO_CREATE);


La migración de Google Analytics v2 a v3 me solucionó el problema.


Para los usuarios de PhoneGap / Cordova que están viendo este error, es porque GAPlugin semioficial usa la versión obsoleta de Google Analytics v2 lib. khalidb91 lo bifurcó y actualizó a v3, que a partir de este momento no se ha fusionado en el complemento semioficial. Toma el código de su tenedor, colócalo como un reemplazo directo a plugins / com.adobe.plugins.GAPlugin y no más bloqueos. Gracias khalidb91!

https://github.com/khalidb91/GAPlugin


Si desea iniciar un servicio que está en otra aplicación, puede usar esto:

Intent serviceIntent = new Intent("action name for the service"); serviceIntent.setPackage("the PackageName for which the service in)");//the destination packageName context.startService(serviceIntent);


Si está intentando usar el mecanismo de licencias de Google, la solución que funcionó para mí:

// explicit Intent, safe Intent serviceIntent = new Intent(ILicensingService.class.getName()); serviceIntent.setPackage("com.android.vending"); boolean bindResult = mContext.bindService(serviceIntent, this, Context.BIND_AUTO_CREATE);

Esto se encuentra en com/google/android/vending/licensing/LicenseChecker.java . Haz una búsqueda de " Base64.decode( "

Editar:

Agregar referencia al archivo java Google Licensing que tiene que ser parcheado:

com.google.android.vending.licensing.LicenseChecker.checkAccess(LicenseChecker.java:150)

parche:

new String( - Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U="))), + Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U="))) + .setPackage("com.android.vending"), // this fix the ''IllegalArgumentException: Service Intent must be explicit'' this, // ServiceConnection.

Fuente: https://code.google.com/p/android/issues/detail?id=78505#c19


Si está intentando iniciar el servicio, pruébelo de esta manera:

var intent = new Intent (this,typeof(MyBoundService)); var serviceConnection = new MyBindServiceConnection (this); BindService (intent, serviceConnection, Bind.AutoCreate);


Solo estaba teniendo este problema yo mismo. El problema radica en su actividad que está comenzando su servicio.

Básicamente, un intento explícito nombra el servicio directamente en la intención cuando se inicia el servicio. Consulte http://developer.android.com/guide/components/intents-filters.html para obtener una explicación más detallada.

Como no se ha publicado su código de actividad, no sé cómo lo está iniciando ahora, pero probablemente debería verse más o menos así:

Intent startIntent = new Intent(this, ServiceToStart.class); this.startService(startIntent); // or bindService(...)


Usé this y funciona muy bien

public static Intent createExplicitFromImplicitIntent(Context context, Intent implicitIntent) { //Retrieve all services that can match the given intent PackageManager pm = context.getPackageManager(); List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0); //Make sure only one match was found if (resolveInfo == null || resolveInfo.size() != 1) { return null; } //Get component info and create ComponentName ResolveInfo serviceInfo = resolveInfo.get(0); String packageName = serviceInfo.serviceInfo.packageName; String className = serviceInfo.serviceInfo.name; ComponentName component = new ComponentName(packageName, className); //Create a new intent. Use the old one for extras and such reuse Intent explicitIntent = new Intent(implicitIntent); //Set the component to be explicit explicitIntent.setComponent(component); return explicitIntent; }