Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android Lollipop convertirse en administrador de dispositivos no funciona

Estoy siguiendo esta guía sobre cómo hacer que mi solicitud de aplicación se convierta en un administrador de dispositivos.
Esto funciona muy bien en cualquier versión de 4.x android con cualquier teléfono, pero no funciona en Lollipop (he probado en un Nexus 5 y en un Nexus 7).

Logcat calza el siguiente error:

*11-02 07:37:09.649: W/DeviceAdminAdd(10020): Cannot start ADD_DEVICE_ADMIN as a new task* 

¿Alguien más ha encontrado este problema con Lollipop? ¿Cuál puede ser la causa?
He ido sobre todas las partes de la guía y se aseguró de que mi XML, menifest, receptor, etc son todos como deberían ser (y de nuevo, funciona en cualquier otra versión de sistema operativo o teléfono que he probado).

Si importa, estoy compilando mi aplicación con la API de destino = 17 y la API de min = 14 por razones de compatibilidad.


Adición del archivo de manifiesto:

 <?xml version='1.0' encoding='utf-8'?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.my.package" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" /> <uses-permission android:name="com.mycompany.permission.NFProvider_WRITE" /> <uses-permission android:name="com.mycompany.permission.NFProvider_READ" /> <uses-permission android:name="android.permission.READ_LOGS" /> <application android:name="com.mycompany.myapp.Application" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <receiver android:name="com.mycompany.myapp.NFAdminReceiver" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/admin"/> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/> </intent-filter> </receiver> <activity android:name="com.mycompany.myapp.ConnectMainActivity" android:label="@string/title_activity_connect_main" android:process="com.mycompany.ui" android:launchMode="singleInstance" android:screenOrientation="portrait" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="com.mycompany.myapp.MainService" android:enabled="true" /> <meta-data android:name="applicationVersion" android:value="1.2.0.213" /> </application> </manifest> 

Código que crea el Propósito:

 ComponentName mComponentName = new ComponentName(activity, NFAdminReceiver.class); Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mComponentName); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, ADMIN_REQUEST_TITLE); activity.startActivityForResult(intent, ADMIN_INTENT); 

La actividad variable es una instancia de ConnectMainActivity

2 Solutions collect form web for “Android Lollipop convertirse en administrador de dispositivos no funciona”

Parece que fue la opción launchMode singleInstance que causó el problema, todavía estoy interesado en saber por qué causa el problema en Lollipop y no en otras versiones.

Por ahora, setting launchMode to singleTask resuelve el problema y parece encajar con el diseño del flujo de la aplicación.

La causa raíz de este mensaje de error está en DeviceAdminAdd.java . Hay un cheque :

 if ((getIntent().getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { Log.w(TAG, "Cannot start ADD_DEVICE_ADMIN as a new task"); finish(); return; } 

Esta comprobación ya estaba allí en 4.0.1 : API nivel 14!

El sujeto de intención de esta comprobación es el intento que desencadena la acción: DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN.

De los documentos :

Una actividad "singleInstance" no permite que ninguna otra actividad sea parte de su tarea.

No explica la diferencia entre API 21 y API <21, pero explica por qué se ha establecido FLAG_ACTIVITY_NEW_TASK.

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