¿Cómo borrar el dispositivo Android cuando el administrador del dispositivo está desactivado?

En mi aplicación, que es un administrador de dispositivos, necesito borrar todo el dispositivo cuando el usuario intenta desactivar la función de administración de la aplicación. Cuando el usuario va a Configuración / Seguridad / Administradores de dispositivos y desactiva la aplicación de administración, primero aparece un cuadro de diálogo "¿Desea desactivar"? Si el usuario dice "sí", se presenta otro pequeño cuadro de diálogo, con el texto proporcionado por AdminReceiver de la aplicación en onDisableRequested (). Si el usuario dice "sí", quiero borrar todo el dispositivo. ¿Cómo lograr esto?

ntenté todo, busqué respuestas por mucho tiempo, no encontré soluciones reales.

Lo que probé:

AdminReceiver tiene una función enDisable (). Traté de borrar el dispositivo en esa función. Sin embargo, parece que onDisable () se llamadespué el administrador ha sido deshabilitado. Por lo tanto, la aplicación no puede usar la función wipeData () (se lanza una excepción de seguridad). También he verificado que isAdminActive () devuelve falso en ese momento.

La documentación oficial no dice esto claramente, pero parece que el administrador ya está deshabilitado cuando se llama a onDisable (). Por lo tanto, tenemos que limpiar el dispositivo antes de ese momento.

AdminReceiver tiene una función enDisableRequested (), que devuelve CharSequence. Traté de poner otro cuadro de alerta en esa función. Esto se bloquea porque no se puede llamar a un cuadro de alerta desde un contexto de no actividad, que parece ser lo que tenemos cuando estamos en onDisableRequested ().

AdminReceiver tiene una función onReceive (), que se llama en cualquier evento. En esta función, nuevamente, no estamos en un contexto de actividad y no podemos presentar nuestros propios diálogos.

Intenté crear otra actividad desde onReceive (). Esto funciona; durante onReceive () cuando recibimos ACTION_DISABLE_ADMIN_REQUESTED, el administrador aún está activo y podemos borrar el dispositivo. Sin embargo, el sistema aún presenta su propio cuadro de diálogo que le pregunta al usuario si debe desactivar el administrador. Si el usuario dice no a nuestro cuadro de diálogo pero sí al cuadro de diálogo del sistema, el administrador se desactivará y no habremos podido borrar el dispositivo.

Intenté lo siguiente, en mi subclase de DeviceAdminReceiver:

@Override
public void onReceive(Context context, Intent intent) {
 // detect whether disabling is requested?
 if (intent.getAction().equals(ACTION_DEVICE_ADMIN_DISABLE_REQUESTED)) {
            confirmWipeDevice(context);

 } else {
    super.onReceive(context, intent);
 }      
}

En otras palabras, no llamo a super.onReceive () si la acción es deshabilitar el administrador. La función confirmWipeDevice () muestra una actividad diferente con un cuadro de diálogo. Esto no muestra el cuadro de diálogo del sistema para confirmar la desactivación de mi aplicación de administración. ¡Sin embargo, esto no evita que la aplicación se deshabilite realmente!

Parece que el sistema Android hace lo siguiente:

Envíe ACTION_DEVICE_ADMIN_DISABLE_REQUESTED al AdminReceiver

Proceda con la desactivación del administrador independientemente de lo que la aplicación de administración quiera hacer

Si el usuario cancela la desactivación, está bien; si no, la aplicación está deshabilitada. No hay forma de que la aplicación rechace la desactivación o realice la eliminación del dispositivo al desactivarla.

La única solución hasta ahora es borrar inmediatamente sin confirmación cuando el usuario quiera desactivar la aplicación de administración. En otras palabras, puedo llamar a getManager (). WipeData () inmediatamente en onDisableRequested (). En ese momento, el administrador aún está activo y esto funciona.

¿Es esto correcto? ¿Cómo borrar el dispositivo cuando el usuario elige deshabilitar la aplicación de administración?

Respuestas a la pregunta(4)

Su respuesta a la pregunta