Como limpar o dispositivo Android quando o administrador do dispositivo está desativado?

No meu aplicativo, que é um administrador de dispositivos, preciso limpar o dispositivo inteiro quando o usuário tentar desativar a função de administrador do aplicativo. Quando o usuário acessa Configurações / Segurança / Administradores de dispositivos e desativa o aplicativo de administrador, primeiro é exibida uma caixa de diálogo "Deseja desativar". Se o usuário disser "sim", será apresentada outra pequena caixa de diálogo, com o texto fornecido pelo AdminReceiver do aplicativo em onDisableRequested (). Se o usuário disser "sim", desejo limpar o dispositivo inteiro. Como conseguir isso?

Tentei de tudo, procurei por respostas longas, não encontrei soluções reai

O que eu tentei:

AdminReceiver tem uma função onDisable (). Eu tentei limpar o dispositivo nessa função. No entanto, parece que onDisable () é chamadodepois d o administrador foi desativado. Portanto, o aplicativo não pode usar a função wipeData () (uma exceção de segurança é lançada). Também verifiquei que isAdminActive () retorna false nesse momento.

A documentação oficial não diz isso claramente, mas parece que o administrador já está desativado quando onDisable () é chamado. Portanto, precisamos limpar o dispositivo antes desse horário.

AdminReceiver possui uma função onDisableRequested (), que retorna CharSequence. Tentei colocar outra caixa de alerta nessa função. Isso trava porque uma caixa de alerta não pode ser chamada de um contexto de não atividade, que parece ser o que temos quando estamos em onDisableRequested ().

@AdminReceiver tem uma função onReceive (), que é chamada em qualquer evento. Nesta função, novamente, não estamos em um contexto de atividade e não podemos apresentar nossos próprios diálogo

Tentei criar outra atividade a partir de onReceive (). Isso funciona; durante onReceive () quando recebermos ACTION_DISABLE_ADMIN_REQUESTED, o administrador ainda está ativo e podemos limpar o dispositivo. No entanto, o sistema ainda apresenta sua própria caixa de diálogo perguntando ao usuário se deseja desativar o administrador. Se o usuário disser não à nossa caixa de diálogo, mas sim à caixa de diálogo do sistema, o administrador será desativado e não poderemos limpar o dispositivo.

Tentei o seguinte, na minha subclasse 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);
 }      
}

Em outras palavras, eu não chamo super.onReceive () se a ação for desativar o administrador. A função confirmWipeDevice () mostra uma atividade diferente com uma caixa de diálogo. Isso não mostra a caixa de diálogo do sistema para confirmar a desativação do meu aplicativo de administrador. No entanto, isso não impede que o aplicativo seja realmente desativado!

Parece que o sistema Android faz o seguinte:

Envie ACTION_DEVICE_ADMIN_DISABLE_REQUESTED ao AdminReceiver

Prossiga com a desativação do administrador, independentemente do que o aplicativo administrador queira fazer

Se o usuário cancelar a desativação, tudo bem; caso contrário, o aplicativo está desativado. Não há como o aplicativo recusar a desativação ou executar a limpeza do dispositivo ao desativa

A única solução até agora é limpar imediatamente sem confirmação quando o usuário deseja desativar o aplicativo de administrador. Em outras palavras, eu posso chamar getManager (). WipeData () imediatamente em onDisableRequested (). Nesse momento, o administrador ainda está ativo e isso funciona.

Isso está correto? Como limpar o dispositivo quando o usuário escolhe desativar o aplicativo de administrador?

questionAnswers(4)

yourAnswerToTheQuestion