web-dev-qa-db-fra.com

Comment exécuter une application Android en mode Kiosk, conserver le mode sans échec désactivé et empêcher le périphérique de réinitialiser le matériel?

Comment exécuter l'application Android en mode Kiosque, conserver le mode sans échec désactivé et empêcher le périphérique de réinitialiser le matériel?

J'ai 3 exigences suivantes pour mon application:

  1. Afficher uniquement les applications spécifiques aux élèves dans le mode normal de l'appareil. Cela peut être possible en désactivant le lanceur par défaut et en activant lanceur de kiosque .

  2. Désactivez ou configurez le mot de passe en mode sans échec pour éviter l'utilisation d'applications système ou d'applications intégrées (youtube, lecteur vidéo, application musicale, etc.).

  3. Limitez la réinitialisation matérielle d'un périphérique en désactivant une pression longue sur les touches matérielles (bouton d'alimentation, boutons de volume) d'un périphérique.

J'ai interprété ces exigences et suis parvenu à une compréhension détaillée ci-dessous.

  1. Nous pouvons redéfinir l'application des élèves de l'école pour qu'elle devienne une application de lancement qui s'exécutera en mode kiosque. Cela implique que nous n’aurons pas besoin d’autres applications de lancement (version d’essai).

  2. Nous pouvons désactiver l'accès en mode sans échec au système ou à des applications tierces via l'application AppLock ou d'autres applications similaires. Il ne fonctionnera que jusqu'à Android Marshmallow 6.0. Mais il y a une limitation imposée par Android - cela ne fonctionnera pas sur les appareils Nougat/Oreo. Nous avons également essayé d’appuyer sur le bouton d’alimentation pour empêcher l’appareil de passer en mode sans échec. Mais Android n'autorise pas l'accès ni l'écoute d'une touche d'alimentation de notre application, comme indiqué dans ce lien et divers autres.

NOTE IMPORTANTE POUR Android 7.0 (NOUGAT) ET 8.0 (OREO) - lien ici

Conformément à la (Application MMGuardian }, pour le moment, le verrouillage du mode sans échec ne peut pas être activé pour les téléphones fonctionnant sous Android 7.0 ou 8.0. Si un ancien téléphone pour lequel le verrouillage du mode sans échec était précédemment activé est mis à jour vers ces versions d'Android, la fonction Verrouillage du mode sans échec sera désactivée.

  1. Nous ne pouvons empêcher aucun dispositif de réinitialisation matérielle, car cette opération est généralement effectuée une fois le téléphone éteint, laissant les applications sans contrôle. Mais il existe une alternative coûteuse. Nous pouvons utiliser un périphérique COSU et concevoir un micrologiciel personnalisé. Plus de détails sur COSU sont disponibles sur les liens ci-dessous. https://developer.Android.com/work/cosu.htmlhttps://developers.google.com/Android/work/requirements/cosu }

Est-ce que quelqu'un peut m'aider à ajouter plus de pensées pour que je puisse comprendre cette situation plus en détail?

Est-ce que je vais dans la bonne direction? ou est-ce que je l'ai détaillé correctement?

10
ketan dhopeshwarkar

Jetez un coup d'œil à API de gestion Android , semble ne pas être possible sans un micrologiciel de périphérique personnalisé.

4
Andrii Omelchenko

Mode Kiosque 100% impossible.

Restreindre les réinitialisations matérielles: L'option de réinitialisation matérielle fait partie du programme d'amorçage. Il est donc difficile d'empêcher les réinitialisations d'usine des périphériques.

J'ai eu la solution, mais ne fonctionne que si le périphérique enraciné

Restreindre la réinitialisation matérielle: copiez votre fichier apk dans system/app, une fois l'appareil restauré, Android réinstallera automatiquement toutes les applications du dossier system/app.

Désactiver APP système: pour désactiver les applications système ou les applications exécutant une commande Shell

pm disable <package name>


Interpréter les clés de volume: Pour l'exécuter, vous n'avez pas besoin d'un accès root, utilisez ce code dans votre classe d'activité.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    // TODO Auto-generated method stub
    if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN))
    {
        // Do what ever you want
    }
    if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP))
    {
        // Do what ever you want
    }
    return true;
}

Bonus désactiver la barre de navigation et la barre d'état
Cacher

 private void hideNavigationBar(){
    try {
        Process process = Runtime.getRuntime().exec("su");
        DataOutputStream os = new DataOutputStream(process.getOutputStream());
        os.writeBytes("pm disable com.Android.systemui\n");
        os.flush();
        try {
        Process process = null;
        process = Runtime.getRuntime().exec("su");
        DataOutputStream os = new DataOutputStream(process.getOutputStream());
        os.writeBytes("reboot\n");
        os.flush();
        process.waitFor();
            } 
            catch (IOException e) {
                e.printStackTrace();
            } 
            catch (InterruptedException e) {
                e.printStackTrace();
            }

    }catch (IOException e) {
        e.printStackTrace();
    }
}

Restaurer à la normale

private void showNavigationBar(){
    try {
        Process process = Runtime.getRuntime().exec("su");
        DataOutputStream os = new DataOutputStream(process.getOutputStream());
        os.writeBytes("pm enable com.Android.systemui\n");
        os.flush();
        os.writeBytes("reboot\n");
        os.flush();
        process.waitFor();

    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Remarque: le périphérique redémarre après l'exécution des commandes Shell. 

Votre jeu avec root, donc vous et les vôtres, en cas de doute, commandez avant de commencer à coder 

4
Anu Martin

Pouvez-vous concevoir puis déployer votre application en tant que DeviceOwner ? Cela vous donne les plus grandes possibilités sur le périphérique, mais le déploiement peut être pénible en fonction du contexte: il ne convient pas pour une publication publique, mais est réalisable si vous pouvez gérer le parc de périphériques. 

2
JBA