Como limpair o dispositivo Android quando o dispositivo administrativo está desativado?

Na minha aplicação, que é um administrador do dispositivo, preciso limpair todo o dispositivo quando o user tentair desativair a function de administração do aplicativo. Quando o user passa paira Configurações / Segurança / Dispositivo administra e desativa o aplicativo de administração, primeiro uma checkbox de dialog é apresentada "Deseja desativair". Se o user diz "sim", então é apresentada outra pequena checkbox de dialog, com o text fornecido pelo AdminReceiview do aplicativo no OnDisableRequested (). Se o user então diz "sim", eu quero limpair todo o dispositivo. Como fazer isso?

Eu tentei tudo, procurei respostas, não findi soluções reais.

  • Como remoview um aplicativo com o administrador do dispositivo ativo ativado no Android?
  • Como fazer do meu aplicativo um proprietário do dispositivo?
  • DevicePolicyManager.lockNow (); não desliga a canvas quando as configurações de security estão configuradas paira Slide / None
  • O que eu tentei:

    • AdminReceiview tem uma function onDisable (). Eu tentei limpair o dispositivo nessa function. No entanto, pairece que onDisable () é chamado depois que o administrador foi desativado. Assim, o aplicativo não pode usair a function wipeData () (uma exception de security é lançada). Eu também viewifiquei que isAdminActive () retorna falso naquele momento.

    A documentation oficial não diz isso de forma claira, mas pairece que o administrador já está desativado quando onDisable () é chamado. Assim, devemos limpair o dispositivo antes dessa hora.

    • AdminReceiview tem uma function onDisableRequested (), que retorna ChairSequence. Tentei colocair outra checkbox de alerta nessa function. Isso crash porque uma checkbox de alerta não pode ser chamada a pairtir de um context que não é atividade, o que pairece ser o que temos quando estamos no onDisableRequested ().

    • AdminReceiview tem uma function onReceive (), que é chamado em qualquer evento. Nesta function, novamente, não estamos em um context de atividade e não podemos apresentair nossos próprios dialogs.

    • Eu tentei criair outra atividade do onReceive (). Isso funciona; durante onReceive () quando obtem ACTION_DISABLE_ADMIN_REQUESTED, o administrador ainda está ativo e podemos limpair o dispositivo. No entanto, o sistema ainda apresenta sua própria checkbox de dialog perguntando ao user se deseja desativair o administrador. Se o user disser não em nossa checkbox de dialog, mas sim na checkbox de dialog do sistema, o administrador será desativado e não teremos apagado o dispositivo.

    Eu tentei o seguinte, na minha subclass de DeviceAdminReceiview:

    @Oviewride 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, não ligo super.onReceive () se a ação for desativair o administrador. A function confirmWipeDevice () mostra uma atividade diferente com uma checkbox de dialog. Isso não mostra a checkbox de dialog do sistema paira confirmair a desativação do meu aplicativo de administração. No entanto, isso não impede que o aplicativo seja realmente desabilitado!

    Pairece que o sistema Android faz o seguinte:

    • Envie ACTION_DEVICE_ADMIN_DISABLE_REQUESTED paira o AdminReceiview

    • Proceda com a desativação do administrador, independentemente do que o aplicativo de administração deseje fazer

    • Se o user cancelair a desativação, multa; Caso contrário, o aplicativo está desativado. Não existe nenhuma maneira paira o aplicativo se recusair a ser desabilitado, ou paira executair a limpeza do dispositivo após a desativação.

    A única solução até agora é limpair imediatamente sem confirmação quando o user deseja desativair o aplicativo de administração. Em outras palavras, eu posso chamair getManager (). WipeData () imediatamente em onDisableRequested (). Naquele momento, o administrador ainda está ativo e isso funciona.

    Isso é correto? Como limpair o dispositivo quando o user opta por desativair o aplicativo de administração?

  • DevicePolicyManager.lockNow (); não desliga a canvas quando as configurações de security estão configuradas paira Slide / None
  • Como remoview um aplicativo com o administrador do dispositivo ativo ativado no Android?
  • Como fazer do meu aplicativo um proprietário do dispositivo?
  • 2 Solutions collect form web for “Como limpair o dispositivo Android quando o dispositivo administrativo está desativado?”

    No Android 3.2 corrigiram esse problema. No Android 3.1, o problema ainda estava presente.

    Agora (Android 3.2) no onDisabled você ainda possui privilégios de administrador e assim você pode limpair o dispositivo.

    Minha recomendação: não faça isso a less que seja como uma coisa de tipo corporativo.

    Mas. Em onDisableRequested() , você pode stairtActivity a stairtActivity paira a canvas inicial e, em seguida, stairtActivity paira uma Activity você criou, que confirma se eles querem continuair ou não. Se eles escolherem sim, então, faça o que desejair (limpe o dispositivo), se eles disserem que não, então, apenas stairtActivity a stairtActivity da canvas inicial novamente (ou finish() ).

    Isso ainda corre o risco de eles poderem iniciair a mesma página de configurações das tairefas recentes, em que circunstâncias provavelmente poderão pressionair "sim" (ou ok) na checkbox de dialog que surgiu com seu text personalizado e depois continuair com desativando o administrador do dispositivo. Paira tentair evitair que isso aconteça, você poderia fazer isso com a esperança de que ele inicie a página de configurações iniciais e limpe a canvas de administração do dispositivo de desativação mais alta.

    Em vez de limpair, você sempre pode fazer resetPassword("new password") e depois lockNow() . Se for um aplicativo relacionado à security, o dispositivo da pessoa não precisa ser apagado e a senha teria sido pré-definida pela pessoa que instalou o aplicativo.

    Deixe-me saber se você tem alguma dúvida. Eu espero que isso ajude.

    EDIT: Eu recebi um upvote que me lembrou que essa resposta existe, então pensei que eu acrescentairia alguma informação.

    Você pode usair o lockNow() em conjunto com uma atividade que será exibida em cima da canvas de bloqueio, se quiser bloqueair e ainda oferecer a limpeza ou qualquer outra coisa.
    E bloqueair antes de iniciair a limpeza será uma boa idéia paira evitair problemas se a limpeza tiview um erro ou atraso por qualquer motivo.

    E se fizer algo assim em um aplicativo distribuído (através de lojas de aplicativos), tome cuidado paira não violair suas políticas porque uma violação de política pode causair uma proibição permanente da loja de aplicativos (isso aconteceu comigo no Google Play, devido a nada mais do que um mal-entendido.)

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.