Je suis en train d'évaluer si et comment une application d'entreprise CF .NET peut être portée pour être exécutée sur des appareils Android. L'application sur les téléphones Windows Mobile est exécutée en mode kiosque, où elle démarre automatiquement en mode plein écran après le démarrage et les utilisateurs ne pouvant pas accéder accidentellement ou volontairement à d'autres parties du téléphone.
Est-il possible sur Android de n'avoir qu'une seule application à démarrer automatiquement après le démarrage et d'empêcher les utilisateurs d'accéder accidentellement (ou volontairement) à d'autres parties de l'appareil Android?
Vous pouvez démarrer automatiquement les applications au démarrage en écoutant l'intention Android.intent.action.BOOT_COMPLETED
dans un BroadcastReceiver et démarrer votre activité à partir de là. Dans l’Activité, vous pouvez vous enregistrer en tant que nouvel écran d’accueil par défaut [1] et gérer les clés.
Je pense qu'il y a des cas où vous ne pouvez pas gérer sans modifier le cadre (comme presser longuement Home sur pour montrer les applications actuellement actives). Je pourrais aussi me tromper.
Mais pour un prototype, cela pourrait suffire.
Amusez-vous à 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 cela (désactiver l'accès au menu, limiter l'ajout d'applications, etc.) pour activer le kiosque. http://code.google.com/p/Android-launcher-plus/
Dans le nouvel aperçu Android L, Google a annoncé Task Locking , qui fait exactement cela. Il semble cependant avoir besoin de racine.
L'aperçu du développeur L introduit une nouvelle API de verrouillage de 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 développent une application éducative pour soutenir l'évaluation des enjeux élevés exigences sur Android. Une fois que votre application a activé ce mode, les utilisateurs utiliseront impossible de voir les notifications, d’accéder à d’autres applications ou de revenir au Écran d'accueil, jusqu'à ce que votre application quitte le mode.
Pour empêcher toute 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 application de propriétaire de périphérique spécialement configurée, via le fichier
Android.app.admin.DevicePolicyManager.setLockTaskComponents()
, méthode.Pour configurer un propriétaire de périphérique, procédez comme suit:
- Associez un appareil exécutant une version
userdebug
d'Android à votre développement machine.- Installez votre application propriétaire du périphérique.
- Créez un fichier
device_owner.xml
et enregistrez-le dans le répertoire/data/system
du périphérique.
$ 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 de tâches dans votre application, vérifiez que votre l'activité est autorisée en appelant DevicePolicyManager.isLockTaskPermitted ().
Pour activer le verrouillage des tâches, appelez
Android.app.Activity.startLockTask()
de votre activité autorisée.Lorsque le verrouillage de tâche est actif, le comportement suivant prend effet:
- La barre d'état est vide, ainsi que les notifications utilisateur et les informations d'état est caché.
- Les boutons Accueil et Applications récentes sont masqués.
- D'autres applications peuvent pas lancer de nouvelles activités.
- L'application actuelle peut démarrer 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é cela pendant un moment, j'ai trouvé une bonne solution. Cela ne fonctionne cependant que sur les appareils enracinés, mais je suppose que s’il s’agit uniquement d’une application, l’enracinement ne devrait pas poser de problème.
Faites de votre application le lanceur en ajoutant
<category Android:name="Android.intent.category.HOME" />
à votre filtre d'intention
Assurez-vous que votre application réduit la barre d’outils pour qu’elle ne puisse pas atteindre la barre de notification. Voir Comment désactiver la barre d’état/la barre de notification sur Android par programme? ou http://blog.vogella.com/2011/02/28/Android-hidding-the-status-and-title-bar/
Ensuite, pour empêcher tout autre programme de s’ouvrir par erreur, utilisez un service d’accessibilité pour vérifier si l’état de la fenêtre a été modifié, comparez-le à une liste blanche ou noire et utilisez ActivityManager.killBackgroundProcesses pour supprimer s’il ne devait pas s’exécuter.
Consultez également http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/ pour un autre moyen
Configurer les appareils à usage unique du développeur Android ont décrit ces choses que vous pouvez facilement apprendre à en savoir plus à partir de là.
Désormais, il est facile de configurer les périphériques Android 6.0 Marshmallow et ultérieurs en tant que périphériques à usage unique (COSU) appartenant à l'entreprise.
Google a récemment publié le Android Management API qui permet de configurer facilement le mode kiosque pour tout appareil Android fonctionnant sous Android 5.1 ou version ultérieure, ainsi que de définir diverses autres stratégies.
J'ai trouvé une autre technique possible dans ce forum post . Citant cet article:
En utilisant les méthodes suivantes, vous pouvez créer une application qui va empêcher les utilisateurs "normaux" de jouer avec autre chose que votre application.
L'application est composée de deux modules. L'activité principale et un un service. Le service est configuré pour démarrer au démarrage. Quand le service est démarré il vérifie si l'activité est en cours d'exécution ou non. Si ce n'est pas le cas son exécution utilise une minuterie pour démarrer l'activité principale.
Lorsque l'activité est suspendue, le service est planifié pour démarrer dans un seconde: 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 l'écran d'accueil, l'écran d'accueil apparaîtra pendant plusieurs secondes. Cependant, votre application reviendra au début après quelques secondes et l'utilisateur ne pourra plus interagir avec aucun d'autres applications ou modifier les paramètres.
Le service est défini pour être un service de premier plan. Cela empêche Android de tuer notre service. Appuyez sur le bouton Stop pour désactiver le kiosque mode.
Il semble y avoir un exemple de fichier Zip de code en mode kiosque disponible au téléchargement , aussi.
le meilleur moyen d'y parvenir est de définir 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>
le moyen le plus fiable consiste à utiliser un appareil avec Lollipop ou supérieur et à utiliser
startLockTask
vous devez d'abord définir votre application en tant que propriétaire de l'appareil. NB votre appareil ne doit pas être configuré: si vous l'avez enregistré, vous devez réinitialiser les paramètres d'usine et passer l'enregistrement au 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 périphérique non configuré, vous pouvez lancer la commande suivante à partir de adb ( aucune racine requise )
adb Shell dpm set-device-owner com.example.myapp/.MyDeviceAdminReceiver
pour éviter qu'Android ne demande à l'utilisateur de donner votre autorisation pour épingler votre application, vous devez appeler
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();
}
Xposed framework peut le faire. Il a besoin de root et il est possible que cela ne fonctionne pas sur toutes les plateformes. Recherchez la méthode disable () de la classe Android.app.StatusBarManager.
Ici, dans le code source Android
Regardez ici comment écrire votre propre module: Tutoriel de développement Xposed
C'est beaucoup plus facile que vous ne le pensez au premier abord. Bonne chance!
Outre la configuration de votre application avec un récepteur BOOT et cette réponse pour empêcher l’extension de la barre d’état, cette solution fonctionne à partir de la version 4.4 en tant que kiosque complète:
Placez 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 va complètement masquer le bouton retour, les applications et le bouton d'accueil.