Como habilitar o bloqueio de tarefas em dispositivos de produção Android 5.0

12

Esta pergunta do StackOverflow explora como habilitar um aplicativo proprietário do dispositivo e, portanto, o modo quiosque, na visualização do desenvolvedor do Android L. Como o método requer uma compilação do Android por depuração de usuários, rooteamento do dispositivo e cópia de um arquivo XML no sistema de arquivos raiz, não parece adequado para a implantação em massa de um dispositivo Android de função única dentro de uma empresa.

Como os aplicativos proprietários do dispositivo serão instalados nos dispositivos Android L de produção?

Adrian Cox
fonte
você empurrou o problema?
KOTIOS
Obrigado @Spynet - esse parece ser o resumo mais completo da solução.
Adrian Cox
1
dê uma olhada aqui para obter um bom guia com src: objectpartners.com/2014/11/04/…
Hayden Thring

Respostas:

14

( Editar: atualizado após mais alguns testes)

Verifique a documentação mais recente .

Esse recurso parece ser chamado de fixação de tela agora e o aplicativo não precisa ser o proprietário do dispositivo. Se o proprietário do dispositivo não estiver definido, o usuário será solicitado a aceitar. Mas há problemas com isso para uso do quiosque, mencionados abaixo.

Há duas maneiras de ativar a fixação da tela:

Manualmente: os usuários podem ativar a fixação de tela em Configurações> Segurança> Fixação de tela e selecionar as tarefas que desejam fixar tocando no ícone de alfinete verde na tela recente. Programaticamente: para ativar a fixação de tela programaticamente, chame startLockTask () no seu aplicativo. Se o aplicativo solicitante não for o proprietário do dispositivo, o usuário será solicitado a confirmar. Um aplicativo proprietário do dispositivo pode chamar o método setLockTaskPackages () para permitir que os aplicativos sejam fixáveis ​​sem a etapa de confirmação do usuário.

Se você ativar a fixação de tela de forma programática (aplicativo que não seja o proprietário do dispositivo) ou no dispositivo usando o alfinete nos últimos casos, obterá o seguinte comportamento:

Uma caixa de diálogo é exibida perguntando ao usuário se ele deseja ativar a fixação da tela e se deseja exigir uma senha para sair. Se eles pressionarem sim, a barra de status e as notificações desaparecerão, os botões Voltar, Página Inicial e Recentes NÃO desaparecerão. Tocar na tela inicial ou nos recentes faz um brinde aparecer informando ao usuário como sair da fixação da tela.

O usuário pode então segurar e recuar para sair da fixação da tela. Se o usuário selecionado para solicitar uma senha, ele será chutado diretamente para a tela de bloqueio. Esse comportamento significa que não é adequado para uma imo de quiosque. Como é muito fácil para os usuários do quiosque acabar olhando para a tela de bloqueio.

Para obter um modo de quiosque adequado, precisamos definir o proprietário do dispositivo. A documentação do Google diz que você precisa fazer isso com a NFC:

Para implantar e ativar o proprietário de um dispositivo, você deve executar uma transferência de dados NFC de um aplicativo de programação para o dispositivo enquanto o dispositivo estiver em seu estado não provisionado.

Usar a NFC para fazer isso parece um pouco complexo (e se um dispositivo não tiver NFC?). Ainda não investiguei isso, portanto, se alguém puder fornecer informações sobre como definir o proprietário do dispositivo pela NFC? Que agora se torna o ponto principal da sua pergunta. (ou seja, definindo o proprietário do dispositivo em um dispositivo não raiz)

Mas para confirmar o comportamento é o esperado, se você faz root em um dispositivo, pode definir o proprietário do dispositivo conforme as instruções anteriores do Google (adicionando um device_owner.xml), como mencionei aqui

Agora você pode bloquear corretamente o aplicativo, nenhuma caixa de diálogo é exibida para o usuário aceitar, quando ativado, os botões recentes e o botão home desaparecem e o usuário não pode sair do aplicativo a menos que seu aplicativo seja desbloqueado. Um modo de quiosque adequado. Eu testei isso em um Nexus 7 2013 com a versão mais recente do Lollipop.

O seguinte snippet ativa o bloqueio:

mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
mDeviceAdminSample = new ComponentName(this, DeviceAdminSample.class);

if (mDPM.isDeviceOwnerApp(this.getPackageName())) {
    Log.d(TAG, "isDeviceOwnerApp: YES");
    String[] packages = {this.getPackageName()};
    mDPM.setLockTaskPackages(mDeviceAdminSample, packages);
} else {
    Log.d(TAG, "isDeviceOwnerApp: NO");
}

if (mDPM.isLockTaskPermitted(this.getPackageName())) {
    Log.d(TAG, "isLockTaskPermitted: ALLOWED");
    startLockTask();
} else {
    Log.d(TAG, "isLockTaskPermitted: NOT ALLOWED");
}
tagy22
fonte
Penso que esta é a melhor resposta possível disponível no momento. O passo da NFC permanece um mistério, mas é uma questão muito mais restrita.
Adrian Cox
Eu tenho tentado fazer a etapa NFC funcionar, mas não tive nenhum sucesso, iniciei uma pergunta sobre isso aqui . Também há um pedido de recurso com o Google para melhorar a fixação de tela para uso quiosque aqui
tagy22
1

Não posso comentar uma resposta que seja um pouco incômoda, mas complementar à resposta de tagy22 que você pode usar dpmpara definir o proprietário do dispositivo. Mais detalhes aqui .

Troy Patrick
fonte
1
dpmo trabalho não seria concluído se uma conta (como a conta do Google) estivesse definida no dispositivo.
Firelord
Será que NFC nesse caso? Tive a impressão de que o proprietário de um dispositivo precisava ser definido antes da adição de um período à conta.
Troy Patrick