Mode kiosque sur Android
je suis en train d'évaluer si et comment une application CF .NET enterprise peut être portée pour fonctionner sur des appareils Android. L'application sur les téléphones mobiles Windows sont exécutés en mode kiosque où l'application autostart en mode plein écran après le démarrage et avec les utilisateurs incapables d'accéder accidentellement ou volontairement toute autre partie du téléphone.
"est-il possible sur Android d'avoir une seule application autostart après le démarrage et d'empêcher les utilisateurs de (accidentellement ou volontairement) l'accès à d'autres parties de l'appareil Android?
10 réponses
vous pouvez lancer automatiquement des applications au démarrage en écoutant l'intention android.intent.action.BOOT_COMPLETED
dans un diffuseur et commencer votre activité à partir de là. Dans L'activité, vous pouvez vous enregistrer comme le nouvel écran d'accueil par défaut[1] et gérer les clés.
je pense qu'il y a des cas que vous ne pouvez pas gérer sans modifier le framework (comme longpress on Home pour afficher les Applications actuellement actives) - je pourrais aussi me tromper.
mais pour un un prototype qui pourrait suffire.
amusez-vous bien à bricoler!
[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>
vous pouvez personnaliser ceci (désactiver l'accès au menu, limiter l'ajout d'application, etc) pour activer le kiosque. http://code.google.com/p/android-launcher-plus/
dans la nouvelle Preview Android L, Google a annoncé verrouillage des tâches , qui fait exactement cela. Il ne semble pas avoir besoin de la racine.
L'aperçu du développeur L introduit une nouvelle API de verrouillage des tâches qui permet vous empêchez temporairement les utilisateurs de quitter votre application ou d'être interrompu par des notifications. Cela pourrait être utilisé, par exemple, si vous sont en train de développer une application d'éducation pour soutenir l'évaluation des enjeux élevés exigence sur Android. Une fois que votre application activera ce mode, les utilisateurs ne pas être en mesure de voir les notifications, accéder à d'autres applications, ou revenir à la Écran d'accueil, jusqu'à ce que votre application quitte le mode.
pour empêcher une utilisation non autorisée, seules les applications autorisées peuvent activer la tâche verrouillage. En outre, l'autorisation de verrouillage des tâches doit être accordée par un l'application propriétaire de périphérique spécialement configurée, via le
android.app.admin.DevicePolicyManager.setLockTaskComponents()
la méthode.pour mettre en place un propriétaire d'appareil, suivez ces étapes:
- fixez un appareil exécutant un Android
userdebug
construire à votre développement machine.- installez votre application propriétaire d'appareil.
- créer un "fichier 151930920" et enregistrez - le dans le répertoire
/data/system
de l'appareil.
$ 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
avant d'utiliser L'API de verrouillage des tâches dans votre application, vérifiez que votre l'activité est autorisé en appelant DevicePolicyManager.isLockTaskPermitted ().
pour activer le verrouillage des tâches, appelez
android.app.Activity.startLockTask()
à partir de votre activité autorisée.lorsque le verrouillage des tâches est actif, le comportement suivant prend effet:
- la barre d'état est vide, et les notifications d'utilisateurs et les informations de statut est caché.
- les boutons Home et Recent Apps sont cachés.
- D'autres applications peuvent ne pas lancer de nouvelles activités.
- l'application actuelle peut commencer de nouvelles activités, tant que cela ne crée pas de nouvelles tâches.
- L'utilisateur reste verrouillé sur votre application jusqu'à ce qu'une activité autorisée appelle
Activity.stopLockTask()
.
Après avoir cherché pendant un moment j'ai trouvé une bonne solution. Cela ne fonctionne que sur les appareils enracinés, mais je suppose que si c'est juste pour cette application alors enracinement il ne devrait pas être un problème.
-
faites de votre application le lanceur en ajoutant
<category android:name="android.intent.category.HOME" />
à votre intention-filtre
-
assurez-vous que votre application s'effondre la barre d'outils de sorte que vous ne pouvez pas atteindre le barre de notification voir comment désactiver la barre d'état / barre de notification sur android programmatically? ou http://blog.vogella.com/2011/02/28/android-hidding-the-status-and-title-bar/
-
ensuite, pour empêcher tout autre programme d'ouvrir par erreur, utilisez un service D'accessibilité pour vérifier si L'État de la fenêtre a changé, comparez le paquet à une liste blanche ou noire et utilisez ActivityManager.killBackgroundProcesses to tuer si elle ne devrait pas courir.
consultez Également http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/ une autre façon
mettre en place des appareils à usage unique Page de développeur android ont décrit ces choses que vous pouvez facilement obtenir pour savoir plus de choses à partir de là.
maintenant, il est facile de configurer Android 6.0 Marshmallow et plus tard appareils en tant que propriété de l'entreprise, appareils à usage unique (COSU).
a trouvé une autre technique possible dans ce forum post . Citant ce billet:
en Utilisant les méthodes suivantes vous pouvez construire une application qui va éviter les "réguliers" utilisateurs de jouer avec autre chose que votre application.
l'application est faite de deux modules. L'activité principale et une service. Le service est configuré pour démarrer au démarrage. Lorsque le service il vérifie si l'activité est en cours ou non. Si elle n'est pas l'exécution utilise un minuteur pour démarrer l'activité principale.
lorsque l'activité est en pause il prévoit le service de commencer dans un deuxième: Code:
Sub Activity_Pause (UserClosed As Boolean)
If kiosk Then StartServiceAt(KioskService, DateTime.Now + 1 * DateTime.TicksPerSecond, false)
End Sub
Si l'utilisateur appuie sur la maison l'écran, l'écran d'accueil apparaît pendant plusieurs secondes. Toutefois, votre demande sera de retour à l'avant après quelques secondes, et l'utilisateur ne sera pas en mesure d'interagir avec n'importe quel d'autres applications ou modifier les paramètres.
le service est prévu pour être un service de premier plan. Cela empêche Android de tuer notre service. Appuyez sur le bouton d'Arrêt pour désactiver le kiosque mode.
il semble y avoir un exemple code de kiosque fichier ZIP disponible pour le téléchargement , aussi.
démarrer votre application au démarrage
la meilleure façon d'accomplir ceci est de configurer votre application comme lanceur
<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>
verrouiller votre application
le moyen le plus fiable est d'utiliser un dispositif avec sucette ou plus et de faire usage de
startLockTask
vous devez d'abord configurer votre application en tant que propriétaire de l'appareil. N.B. votre appareil doit être non visionné: si vous l'avez enregistré, vous devez faire une réinitialisation d'usine et sauter le enregistrement de Compte.
pour pouvoir enregistrer votre application, vous devez d'abord configurer un composant 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!
}
}
une fois que vous avez un appareil non prévu, vous pouvez lancer la commande suivante de adb ( no root required )
adb shell dpm set-device-owner com.example.myapp/.MyDeviceAdminReceiver
pour éviter android demander à l'utilisateur les permissions d'épingler votre application, vous devez appeler setLockTaskPackages
enfin!
@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();
}
Google a récemment publié le Android Management API qui permet de configurer facilement le mode kiosk pour tous les appareils Android exécutant Android 5.1 ou supérieur, et aussi de définir diverses autres politiques.
Xposed framework ne peut le faire. Il a besoin de root et il est possible qu'il ne fonctionne pas sur toutes les plateformes. Rechercher disable () méthode dans la classe android.App.StatusBarManager .
ici dans le code source Android
Regardez ici comment écrire votre propre module: tutoriel de développement Xposé
c'est beaucoup plus facile qu'à première vue. Bonne Chance!
avec la mise en place de votre application avec un récepteur de démarrage, et cette réponse pour empêcher l'expansion de barre d'état, Cette solution fonctionne sur 4.4 et au-dessus comme une application de kiosque complète:
Place dans votre 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);
}
}
});
}
cela masquera complètement le bouton back, les applications et le bouton home.