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:
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 .
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.).
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.
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).
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.
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?
Jetez un coup d'œil à API de gestion Android , semble ne pas être possible sans un micrologiciel de périphérique personnalisé.
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
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.