Mode kiosque sous Android

114

Je suis en train d'évaluer si et comment une application d'entreprise CF .NET peut être portée pour s'exécuter sur des appareils Android. L'application sur les téléphones Windows Mobile est exécutée en mode kiosque où l'application démarre automatiquement en mode plein écran après le démarrage et avec les utilisateurs incapables d'accéder accidentellement ou volontairement à d'autres parties du téléphone.

Est-il possible sur Android d'avoir une seule application de démarrage automatique après le démarrage et d'empêcher les utilisateurs d'accéder accidentellement (ou volontairement) à d'autres parties de l'appareil Android?

Erik H
la source
Résolvez-vous votre problème?
Menna-Allah Sami
3
Oui c'est possible. J'ai créé un (très) long article de blog à ce sujet: andreas-schrade.de/2015/02/16
...
J'ai également créé un article de blog à ce sujet (partiellement) à l'aide de Lollipop - il exclut cependant la partie du récepteur de démarrage: sureshjoshi.com/mobile/android-kiosk-mode-without-root
SJoshi
J'ai répondu à une question similaire ici sur différentes méthodes pour créer des appareils à usage unique verrouillés: stackoverflow.com/a/43644803/2888763
Trevor Halvorson

Réponses:

29

Vous pouvez démarrer automatiquement les applications au démarrage en écoutant l' android.intent.action.BOOT_COMPLETEDintention dans un BroadcastReceiver et démarrer votre activité à partir de là. Dans l'activité, vous pouvez vous enregistrer comme nouvel écran d'accueil par défaut [1] et gérer les touches.

Je pense qu'il y a des cas que vous ne pouvez pas gérer sans modifier le cadre (comme appuyez longuement sur Home pour afficher 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>
Valentin
la source
1
Vous devez également remplacer le onbackpressed de la première activité, sinon lorsque vous appuyez sur le bouton de retour, vous accédez au lanceur
ademar111190
Comment atteindre le dialogue système n barres de notification désactivées via le code
Gnanam R
1
@GnanamR: vérifiez ma réponse sur: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51
@Rinkalkumar Exécutez l'application en mode plein écran.
John61590
17

Vous pouvez personnaliser cela (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/

rbot
la source
7
Puis-je savoir pourquoi ce vote a été rejeté? J'ai écrit mon application de kiosque Android à part entière, actuellement déployée en éditant et en développant au-dessus du lanceur Android plus.
rbot
1
Dans ce cas, je vote à la fois votre réponse et votre commentaire ;-)
Mawg dit de réintégrer Monica le
@rbot comment as-tu fait ça? J'essaie de créer une application de kiosque depuis des lustres et j'ai résolu presque tout le reste, sauf pour m'assurer que la barre des notifications ne s'ouvre pas.
Wakka02 du
1
@ Wakka02 Je pense que je cherchais onwindowchanged ou un événement similaire (qui peut éventuellement indiquer l'ouverture du plateau de notification) et fermez le plateau. Je l'ai fait il y a longtemps, alors ne vous souvenez pas des détails.
rbot
@ Wakka02: vérifiez ma réponse sur: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51
17

Dans le nouvel Android L Preview, Google a annoncé le verrouillage des tâches , qui fait exactement cela. Il semble cependant avoir besoin de racine.

L Developer Preview introduit une nouvelle API de verrouillage de tâches qui vous permet d'empêcher temporairement les utilisateurs de quitter votre application ou d'être interrompus par des notifications. Cela peut être utilisé, par exemple, si vous développez une application éducative pour prendre en charge les exigences d'évaluation à enjeux élevés sur Android. Une fois que votre application active ce mode, les utilisateurs ne pourront pas voir les notifications, accéder à d'autres applications ou revenir à l'écran d'accueil tant que votre application ne quittera pas le mode.

Pour éviter toute utilisation non autorisée, seules les applications autorisées peuvent activer le verrouillage des tâches. En outre, l'autorisation de verrouillage de tâche doit être accordée par une application de propriétaire d'appareil spécialement configurée, via la android.app.admin.DevicePolicyManager.setLockTaskComponents()méthode.

Pour configurer un propriétaire d'appareil, procédez comme suit:

  • Connectez un appareil exécutant une version Android userdebugà votre machine de développement.
  • Installez l'application du propriétaire de votre appareil.
  • Créez un device_owner.xmlfichier et enregistrez-le dans le /data/systemrépertoire 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 de tâches dans votre application, vérifiez que votre activité est autorisée en appelant DevicePolicyManager.isLockTaskPermitted ().

Pour activer le verrouillage des tâches, appelez android.app.Activity.startLockTask() depuis votre activité autorisée.

Lorsque le verrouillage de tâche est actif, le comportement suivant prend effet:

  • La barre d'état est vide et les notifications utilisateur et les informations d'état sont masquées.
  • Les boutons Accueil et Applications récentes sont masqués.
  • D'autres applications peuvent ne 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().
nhaarman
la source
3
developer.android.com/guide/topics/admin/device-admin.html - lors du déploiement d'une application Device Admin.
Toshe
2
Voici mon article sur les verrous de tâches avec un algorithme de configuration complet pvolan.blogspot.ru/2017/01/android-50-kiosk-mode-aka-super.html
PVoLan
9

Après avoir cherché cela 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, l'enracinement ne devrait pas être un problème.

Consultez également http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/ pour une autre manière

matt_lethargic
la source
5

Démarrer votre application au démarrage

la MEILLEURE façon 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>

Verrouiller votre application

le moyen le plus fiable est d'utiliser un appareil avec Lollipop ou supérieur et d'utiliser

startLockTask

vous devez d'abord définir votre application comme propriétaire de l'appareil. NB votre appareil ne doit pas être provisionné: si vous l'avez enregistré, vous devez effectuer une réinitialisation d'usine et ignorer l'enregistrement du 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 provisionné, vous pouvez lancer la commande suivante à partir d'adb ( pas de racine requise )

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

pour éviter qu'android ne demande à l'utilisateur les autorisations 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();
}
absurde
la source
5

Google a récemment publié l' API de gestion Android qui permet de configurer facilement le mode kiosque pour tous les appareils Android exécutant Android 5.1 ou supérieur, et également de définir diverses autres politiques.

Fred
la source
Super trouvaille. Voici un lien direct vers les informations sur le mode kiosque: développeurs.google.com
Robert Liberatore
3

La page Configurer les appareils à usage unique du développeur Android a décrit ces choses que vous pouvez facilement apprendre à en savoir plus à partir de là.

Il est désormais facile de configurer les appareils Android 6.0 Marshmallow et les appareils ultérieurs en tant qu'appareils COSU (appartenant à l'entreprise) à usage unique.

Keyur
la source
2

J'ai trouvé une autre technique possible dans ce message du forum . Citant ce message:

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

En utilisant les méthodes suivantes, vous pouvez créer une application qui empêchera les utilisateurs "normaux" de jouer avec autre chose que votre application.

L'application est composée de deux modules. L'activité principale et un service. Le service est configuré pour démarrer au démarrage. Lorsque le service est démarré, il vérifie si l'activité est en cours d'exécution ou non. S'il ne fonctionne pas, il utilise une minuterie pour démarrer l'activité principale.

Lorsque l'activité est mise en pause, il planifie le démarrage du service dans une 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 sur l'écran d'accueil, l'écran d'accueil apparaîtra pendant plusieurs secondes. Cependant, votre application reviendra au premier plan après quelques secondes et l'utilisateur ne pourra pas interagir avec d'autres applications ou modifier les paramètres.

Le service est défini comme un service de premier plan. Cela empêche Android de tuer notre service. Appuyez sur le bouton Stop pour désactiver le mode kiosque.

Un exemple de fichier ZIP de code en mode kiosque semble également disponible au téléchargement .

Grand riche
la source
2

Le framework Xposed peut le faire. Il a besoin de root et il est possible que cela ne fonctionne pas sur toutes les plates-formes. Recherchez la méthode disable () dans 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 à première vue. Bonne chance!

JohnyTex
la source
Un module Xposed que vous pensez faire cela?
Firelord
0

Outre la configuration de votre application avec un récepteur BOOT et cette solution pour empêcher l'expansion de la barre d'état, cette solution fonctionne sur 4.4 et plus en tant qu'application de 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 masquera complètement le bouton de retour, les applications et le bouton d'accueil.

Kristy Welsh
la source
qu'en est-il de la barre de notification?
Elshan