Modo quiosque no Android

114

Estou avaliando se e como um aplicativo corporativo CF .NET pode ser transferido para ser executado em dispositivos Android. O aplicativo em telefones Windows Mobile é executado em modo quiosque, onde o aplicativo é iniciado automaticamente em modo de tela inteira após a inicialização e os usuários não conseguem acidentalmente ou por vontade própria acessar qualquer outra parte do telefone.

É possível no Android ter apenas um aplicativo inicializado automaticamente após a inicialização e evitar que os usuários acessem acidentalmente (ou voluntariamente) qualquer outra parte do dispositivo Android?

Erik H
fonte
Você resolve seu problema?
Menna-Allah Sami
3
Sim, é possível. Eu criei uma postagem (muito) longa no blog sobre isso: andreas-schrade.de/2015/02/16/…
funcoder
Eu também criei uma postagem no blog sobre isso (parcialmente) usando o Lollipop - ele exclui a parte do receptor de inicialização: sureshjoshi.com/mobile/android-kiosk-mode-without-root
SJoshi
Eu respondi a uma pergunta semelhante aqui sobre métodos diferentes para criar dispositivos de uso único bloqueados: stackoverflow.com/a/43644803/2888763
Trevor Halvorson

Respostas:

29

Você pode iniciar automaticamente os aplicativos na inicialização, ouvindo a android.intent.action.BOOT_COMPLETEDintenção em um BroadcastReceiver e iniciar sua atividade a partir daí. Na atividade, você pode se registrar como a nova tela inicial padrão [1] e manipular as chaves.

Acho que há alguns casos que você não pode controlar sem modificar a estrutura (como longpress em Home para mostrar os aplicativos ativos no momento) - eu também poderia estar enganado.

Mas para um protótipo isso pode ser suficiente.

Divirta-se mexendo!

[1]:

<intent-filter>
 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.HOME" />
 <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Valentin
fonte
1
Você também precisa substituir o onbackpressed da primeira atividade senão quando você pressiona o botão de voltar, você vai para o iniciador
ademar111190
Como obter a caixa de diálogo do sistema e as barras de notificação desativadas por meio do código
Gnanam R
1
@GnanamR: verifique minha resposta em: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51
@Rinkalkumar Execute o aplicativo em modo de tela inteira.
John61590
17

Você pode personalizar isso (desabilitar o acesso ao menu, limitar a adição de aplicativos etc.) para habilitar o quiosque. http://code.google.com/p/android-launcher-plus/

rbot
fonte
7
Eu poderia saber por que isso foi rejeitado? Eu escrevi meu aplicativo de quiosque Android completo, atualmente implantado, editando e desenvolvendo em cima do Android launcher plus.
rbot
1
Nesse caso, eu
voto positivamente
@rbot, como você fez isso? Venho tentando construir um aplicativo de quiosque há muito tempo e resolvi quase tudo, exceto para garantir que a bandeja de notificações não abra.
Wakka02
1
@ Wakka02 Acho que estava procurando onwindowchanged ou algum evento semelhante (que pode indicar a abertura da bandeja de notificação) e feche a bandeja. Eu fiz isso há muito tempo, então não me lembro dos detalhes.
rbot
@ Wakka02: verifique minha resposta em: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51
17

No novo Android L Preview, o Google anunciou o Bloqueio de Tarefas , que faz exatamente isso. No entanto, parece que precisa de root.

O L Developer Preview apresenta uma nova API de bloqueio de tarefas que permite restringir temporariamente os usuários de deixar seu aplicativo ou serem interrompidos por notificações. Isso pode ser usado, por exemplo, se você estiver desenvolvendo um aplicativo educacional para oferecer suporte a requisitos de avaliação de alto risco no Android. Depois que seu aplicativo ativar esse modo, os usuários não poderão ver notificações, acessar outros aplicativos ou retornar à tela inicial até que seu aplicativo saia do modo.

Para evitar o uso não autorizado, apenas aplicativos autorizados podem ativar o bloqueio de tarefas. Além disso, a autorização de bloqueio de tarefa deve ser concedida por um aplicativo do proprietário do dispositivo especialmente configurado, por meio do android.app.admin.DevicePolicyManager.setLockTaskComponents()método.

Para configurar um proprietário de dispositivo, siga estas etapas:

  • Anexe um dispositivo executando uma userdebugversão Android à sua máquina de desenvolvimento.
  • Instale o aplicativo do proprietário do seu dispositivo.
  • Crie um device_owner.xmlarquivo e salve-o /data/systemno diretório do dispositivo.
$ adb root
$ adb shell stop
$ rm /tmp/device_owner.xml
$ echo "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" >> /tmp/device_owner.xml
$ echo "&device-owner package=\"<your_device_owner_package>\" name=\"*<your_organization_name>\" />" >> /tmp/device_owner.xml
$ adb push /tmp/device_owner.xml /data/system/device_owner.xml
$ adb reboot

Antes de usar a API de bloqueio de tarefas em seu aplicativo, verifique se sua atividade está autorizada chamando DevicePolicyManager.isLockTaskPermitted ().

Para ativar o bloqueio de tarefas, ligue android.app.Activity.startLockTask() de sua atividade autorizada.

Quando o bloqueio de tarefas está ativo, o seguinte comportamento entra em vigor:

  • A barra de status fica em branco e as notificações do usuário e informações de status ficam ocultas.
  • Os botões Home e Recent Apps estão ocultos.
  • Outros aplicativos podem não iniciar novas atividades.
  • O aplicativo atual pode iniciar novas atividades, desde que isso não crie novas tarefas.
  • O usuário permanece bloqueado em seu aplicativo até que uma atividade autorizada seja chamada Activity.stopLockTask().
nhaarman
fonte
3
developer.android.com/guide/topics/admin/device-admin.html - na implantação de um aplicativo de administração de dispositivos.
Toshe
2
Aqui está meu artigo sobre bloqueios de tarefas com algoritmo de configuração completa pvolan.blogspot.ru/2017/01/android-50-kiosk-mode-aka-super.html
PVoLan
9

Depois de pesquisar isso por um tempo, descobri uma boa solução. Porém, isso só funciona em dispositivos com root, mas acho que se for apenas para este aplicativo, então, fazer o root não será um problema.

Verifique também http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/ para outra forma

matt_lethargic
fonte
5

Iniciando seu aplicativo na inicialização

a MELHOR maneira de fazer isso é definir seu aplicativo como o iniciador

<activity ...
  android:launchMode="singleInstance"
  android:windowActionBar="false">
    <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.HOME" />
      <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Bloqueando seu aplicativo

a maneira mais confiável é usar um dispositivo com Lollipop ou superior e fazer uso de

startLockTask

primeiro você deve definir seu aplicativo como o proprietário do dispositivo. NB seu dispositivo deve ser desprovisionado: se você o registrou, você deve fazer uma redefinição de fábrica e pular o registro da conta.

para poder registrar seu aplicativo, você deve primeiro configurar um componente DeviceAdminReceiver:

package com.example.myapp;

public class MyDeviceAdminReceiver extends android.app.admin.DeviceAdminReceiver {
    @Override
    public void onEnabled(Context context, Intent intent) {
        Toast.makeText(context, "Device admin permission received", Toast.LENGTH_SHORT).show();
    }

    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        return "are you sure?";
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        Toast.makeText(context, "Device admin permission revoked", Toast.LENGTH_SHORT).show();
    }


    @Override
    public void onLockTaskModeExiting(Context context, Intent intent) {
        // here you must re-lock your app. make your activity know of this event and make it call startLockTask again!
    }
}

depois de ter um dispositivo não provisionado, você pode iniciar o seguinte comando do adb ( sem necessidade de root )

adb shell dpm set-device-owner com.example.myapp/.MyDeviceAdminReceiver

para evitar que o Android peça permissão ao usuário para fixar seu aplicativo, você deve chamar setLockTaskPackages

finalmente!

@Override
public void onResume(){
    super.onResume();
    DevicePolicyManager mDevicePolicyManager = (DevicePolicyManager) getSystemService(
            Context.DEVICE_POLICY_SERVICE);
    ComponentName mAdminComponentName = new ComponentName(getApplicationContext(), MyDeviceAdminReceiver.class);
    mDevicePolicyManager.setLockTaskPackages(mAdminComponentName, new String[]{getPackageName()});
    startLockTask();
}
@Override
public void finish(){
    stopLockTask();
    super.finish();
}
absurdo
fonte
5

O Google lançou recentemente a API de gerenciamento do Android, que permite configurar facilmente o modo quiosque para qualquer dispositivo Android com Android 5.1 ou superior e também definir várias outras políticas.

Fred
fonte
Achado incrível. Aqui está um link direto para as informações do modo Kiosk: developers.google.com/android/management/policies/…
Robert Liberatore
3

Página de configuração de dispositivos de uso único do desenvolvedor Android descreveu essas coisas que você pode facilmente saber mais a partir daí.

Agora é fácil configurar o Android 6.0 Marshmallow e dispositivos posteriores como dispositivos corporativos de uso único (COSU).

Keyur
fonte
2

Encontrou outra técnica possível nesta postagem do fórum . Citando essa postagem:

http://www.basic4ppc.com/forum/basic4android-getting-started-tutorials/10839-android-kiosk-mode-tutorial.html

Usando os métodos a seguir, você pode construir um aplicativo que impedirá que usuários "regulares" joguem com qualquer coisa que não seja o seu aplicativo.

O aplicativo é composto por dois módulos. A atividade principal e um serviço. O serviço está configurado para iniciar na inicialização. Quando o serviço é iniciado, ele verifica se a atividade está em execução ou não. Se não estiver em execução, ele usa um cronômetro para iniciar a atividade principal.

Quando a atividade é pausada, ela programa o serviço para iniciar em um segundo: Código:

Sub Activity_Pause (UserClosed As Boolean)
    If kiosk Then StartServiceAt(KioskService, DateTime.Now + 1 * DateTime.TicksPerSecond, false)    
End Sub

Se o usuário pressionar na tela inicial, a tela inicial aparecerá por vários segundos. No entanto, seu aplicativo voltará para a frente após alguns segundos e o usuário não poderá interagir com nenhum outro aplicativo ou alterar as configurações.

O serviço está definido para ser um serviço de primeiro plano. Isso evita que o Android mate nosso serviço. Pressione o botão Parar para desativar o modo quiosque.

Parece haver um exemplo de arquivo ZIP com o código do modo quiosque disponível para download também.

Big Rich
fonte
2

O framework Xposed pode fazer isso. É necessário root e existe a possibilidade de não funcionar em todas as plataformas. Procure o método disable () na classe android.app.StatusBarManager .

Aqui no código-fonte do Android

Veja aqui como escrever seu próprio módulo: Tutorial de desenvolvimento do Xposed

É muito mais fácil do que você pensa à primeira vista. Boa sorte!

JohnyTex
fonte
Algum módulo Xposed que você acha que faz isso?
Firelord
0

Junto com a configuração de seu aplicativo com um receptor de BOOT, e esta resposta para evitar a expansão da barra de status, esta solução funciona no 4.4 e superior como um aplicativo de quiosque completo:

Coloque em seu onCreate ():

    final View view = (View) findViewById(android.R.id.content);
    if (view != null) {
        //"hides" back, home and return button on screen. 
        view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
                                   View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
                                   View.SYSTEM_UI_FLAG_IMMERSIVE |
                                   View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
                                   View.SYSTEM_UI_FLAG_FULLSCREEN);
        view.setOnSystemUiVisibilityChangeListener
                (new View.OnSystemUiVisibilityChangeListener() {
                    @Override
                    public void onSystemUiVisibilityChange(int visibility) {
                        // Note that system bars will only be "visible" if none of the
                        // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
                        if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                            view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
                                    View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
                                    View.SYSTEM_UI_FLAG_IMMERSIVE |
                                    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
                                    View.SYSTEM_UI_FLAG_FULLSCREEN);
                        }
                    }
                });
    }

Isso ocultará completamente o botão Voltar, os aplicativos e o botão inicial.

Kristy Welsh
fonte
e a barra de notificação?
Elshan