web-dev-qa-db-fra.com

Comment désactiver les boutons Accueil et autres boutons système sous Android?

Je dois désactiver les boutons Accueil et autres boutons système dans mon application Android.

Exemple:MX Player ( Voir sur Google Play ) - vous pouvez appuyer sur l'icône "verrouiller" sur l'écran du lecteur pour verrouiller tous les boutons du système matériel et logiciel. 

Cela fonctionne bien SANS RACINER. 

Je l'ai testé sur certains appareils avec différentes versions d'Android. J'ai essayé de démonter Kids Lock (plug-in) mais je ne sais pas encore comment cela fonctionne.

J'ai besoin de la même solution que le Kids Lock (plugin) pour MX Player: - désactiver les boutons Accueil, Retour et tous les autres boutons du système.

Aucune suggestion?

74
user1024

Tout d’abord, réfléchissez longuement si vous voulez vraiment désactiver le bouton Home ou tout autre bouton (par exemple le bouton Back), ce n’est pas quelque chose à faire (au moins la plupart du temps, c’est un mauvaise conception). Je ne peux parler que de moi-même, mais si je télécharge une application qui ne me permet pas de cliquer sur un bouton du système d'exploitation, la prochaine chose que je fais est de désinstaller cette application et de laisser une très mauvaise critique. Je crois aussi que votre application ne sera pas présentée sur l'App Store.

À présent...

Notez que MX Player demande la permission de dessiner par dessus d'autres applications:MX Player permissions
Étant donné que vous ne pouvez pas remplacer le bouton Home sur le périphérique Android (du moins non dans les dernières versions du système d'exploitation). MX Player se dessine au-dessus de votre lanceur lorsque vous "verrouillez" l'application et cliquez sur le bouton Home .
Pour voir un exemple de cela, il est un peu plus simple et plus simple à comprendre, vous pouvez voir l’application Facebook Messenger .

Comme on m'a demandé de fournir des informations supplémentaires sur MX Player Status Bar et Navigation Bar "surcharger", je modifie ma réponse pour inclure également ces sujets.

Tout d’abord, MX Player utilise le mode immersif plein écran ( DevBytes Video ) sur KitKat.
Android 4.4 (API niveau 19) introduit un nouvel indicateur SYSTEM_UI_FLAG_IMMERSIVE pour setSystemUiVisibility () qui permet à votre application de passer réellement en "plein écran". Cet indicateur, lorsqu'il est combiné aux indicateurs SYSTEM_UI_FLAG_HIDE_NAVIGATION et SYSTEM_UI_FLAG_FULLSCREEN , masque les barres de navigation et d'état et permet à votre application de capturer tous les événements tactiles à l'écran.

Lorsque le mode plein écran immersif est activé, votre activité continue de recevoir tous les événements tactiles. L'utilisateur peut révéler les barres système en effectuant un balayage vers l'intérieur le long de la région où elles apparaissent normalement. Cela efface l'indicateur SYSTEM_UI_FLAG_HIDE_NAVIGATION (et l'indicateur SYSTEM_UI_FLAG_FULLSCREEN , le cas échéant), de sorte que les barres système deviennent visibles. Cela déclenche également votre View.OnSystemUiVisibilityChangeListener , s'il est défini. Toutefois, si vous souhaitez que les barres système se cachent automatiquement après quelques instants, vous pouvez utiliser le drapeau SYSTEM_UI_FLAG_IMMERSIVE_STICKY . Notez que la version "collante" de l'indicateur ne déclenche aucun écouteur, car les barres système temporairement affichées dans ce mode sont dans un état transitoire. 

Deuxièmement: Masquer la barre d'état
Troisième: Masquage de la barre de navigation
Veuillez noter que bien que l’utilisation du plein écran immersif ne concerne que KitKat, masquer les Status Bar et Navigation Bar ne concerne pas uniquement KitKat.

Je n'ai pas grand chose à dire sur les 2ème et 3ème. Vous avez une idée, je crois, c'est une lecture rapide en tout cas. Veillez simplement à porter une attention particulière à View.OnSystemUiVisibilityChangeListener .

J'ai ajouté un résumé qui explique ce que je voulais dire, ce n'est pas complet et a besoin d'être corrigé, mais vous aurez l'idée. https://Gist.github.com/Epsiloni/8303531

Bonne chance pour mettre cela en œuvre et amusez-vous!

86
Assaf Gamliel

J'ai suivi la réponse de shaobin0604 et j'ai finalement réussi à verrouiller le bouton HOME en ajoutant:

<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW" />

to AndroidManifest.xml Tout ce que vous avez à faire est de copier le HomeKeyLocker.Java depuis la bibliothèque de shaobin dans votre projet et de le mettre en œuvre comme dans l'exemple de shaobin . BTW: La version Android de mon AVD est Android 4.0.3.

12
Lê Quang Duy

Vous pouvez utiliser Android-HomeKey-Locker pour désactiver HOME KEY et d’autres touches système (telles que BACK KEY et MENU KEY).

J'espère que cela vous aidera dans votre candidature. Merci.

11
shaobin0604

Vous pouvez désactiver les boutons d'accueil et récents Android 5.0 à l'aide de la fonction d'épinglage d'écran mentionnée ici :

Android 5.0 introduit une nouvelle API d'épinglage d'écran qui vous permet empêcher temporairement les utilisateurs de quitter votre tâche ou d'être interrompus par notifications. Cela pourrait être utilisé, par exemple, si vous êtes développer une application éducative pour soutenir l'évaluation des enjeux élevés exigences sur Android, ou une application à usage unique ou kiosque . Une fois que votre application a activé l'épinglage à l'écran, les utilisateurs ne peuvent pas voir notifications, accéder à d'autres applications ou revenir à l'écran d'accueil, jusqu'au votre application quitte le mode.

Vous pouvez verrouiller l'appareil pour qu'il devienne un kiosque. La barre de navigation n'est pas masquée, mais les boutons accueil et récent peuvent être supprimés ou désactivés en fonction de l'activation du mode. J'ai écrit quelques informations après avoir testé cette fonctionnalité ici .

10
tagy22

Juste une supposition, mais je pense qu'avec la permission SYSTEM_ALERT_WINDOW (affichée sous la forme "Dessiner par-dessus d'autres applications", voir ici ), cela pourrait être possible: affichez votre application en plein écran, type d'alerte système fenêtre. De cette manière, toutes les autres applications, même l'écran d'accueil, seront masquées. Par conséquent, si vous appuyez sur la touche Accueil, elle ne sera pas réellement désactivée, sans aucun effet visible.

MX Player a cette autorisation déclarée, et Facebook Messenger l’a également pour afficher " têtes de chat " sur tout le reste - ce pourrait donc être la solution.

Mise à jour (ajoutée à partir de mes commentaires): Ensuite, utilisez SYSTEM_UI_FLAG_HIDE_NAVIGATION en conjonction avec la capture d'événements tactiles/avec OnSystemUiVisibilityChangeListener pour remplacer le comportement par défaut (la barre de navigation apparaît sur la touche). . De plus, puisque vous avez dit que le geste immersif de sortie ne fonctionnait pas, vous pouvez également définir SYSTEM_UI_FLAG_IMMERSIVE_STICKY (avec SYSTEM_UI_FLAG_FULLSCREEN et SYSTEM_UI_FLAG_HIDE_NAVIGATION).

6
molnarm

Auparavant, il était possible de désactiver le bouton Accueil, mais maintenant ce n'est pas le cas. Cela est dû à un logiciel malveillant qui piégerait l'utilisateur.

Vous pouvez voir plus de détails ici: Désactiver le bouton Accueil sous Android 4.0+

Enfin, le bouton Précédent peut être désactivé, comme vous pouvez le voir dans cette autre question: Désactiver le bouton Précédent sous Android

4
Alvaro Cavalcanti

Moi aussi, je cherchais cela depuis quelque temps, et j'ai finalement pu le faire comme j'avais besoin, c'est-à-dire que la barre de navigation est inaccessible, la barre d'état est inaccessible, même si vous appuyez longuement sur le bouton d'alimentation, ni le menu d'alimentation ni les boutons de navigation. Grâce à @Assaf Gamliel, sa réponse m'a conduit sur le bon chemin. J'ai suivi this tutorial avec de légères modifications. En spécifiant Type, j'ai spécifié WindowManager.LayoutParams.TYPE_SYSTEM_ERROR au lieu de WindowManager.LayoutParams.TYPE_PHONE, sinon notre "superposition" ne cachera pas les barres système. Vous pouvez jouer avec les drapeaux, la hauteur, la largeur, etc. afin que tout se comporte comme vous le souhaitez.

2
aravindsagar

Commencez par créer une méthode:

public void hideNavigationBar() {
        final View decorView = this.getWindow().getDecorView();
        final int uiOptions =
                View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;

        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                YourActivityName.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        decorView.setSystemUiVisibility(uiOptions);

                    }
                });
            }
        };

        timer.scheduleAtFixedRate(task, 1, 2);

    }

Ensuite, vous l'appelez avec la méthode onCreate() de votre activité . Appelez-le à nouveau avec la méthode onResume() . Vous pouvez ensuite ajouter une autre méthode à votre activité comme celle-ci:

@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        hideNavigationBar();
    }

Ce sera ça . N'oubliez pas qu'il verrouillera l'écran jusqu'à la prochaine fois que l'utilisateur touchera l'écran. Dans la classe Timer, vous pourrez modifier le délai et vous permettre de modifier certaines choses pour cette instance. .

2

Si vous ciblez Android 5.0 et supérieur. Vous pouvez utiliser:

Activity.startLockTask()
2
lowolfne

je ne sais pas comment faire pour le bouton home diable . aussi longtemps que mes connaissances je me suis suivi le lien.

référez-vous au lien: - http://developer.Android.com/reference/Android/view/KeyEvent.html#KEYCODE_HOME

Constante de code de clé: touche Accueil. Cette clé est gérée par la structure et n'est jamais remise aux applications.

Mais on peut faire un bouton arrière .. .. .espérer que le code suivant vous aide.

@Override
public void onBackPressed() {
    //return nothing 
    return;
}
1
Harshal Benake

Vous ne pouvez pas désactiver le bouton Accueil à partir de ICS mots, mais vous pouvez désactiver les autres boutons comme suit

@Override
public boolean dispatchKeyEvent(KeyEvent keyEvent){
   return true;
}
0
CR Sardar

Pour ceux qui cherchent à supprimer complètement la navigation logicielle sur un périphérique root (ou une ROM personnalisée) Android, vous pouvez modifier le fichier texte build.prop dans le dossier système.

Définissez la variable/valeur suivante:

gemu.hw.mainkeys=1

C'est ce que les vendeurs utilisent pour désactiver la navigation logicielle lorsqu'ils ont des boutons physiques.

0
Le-roy Staines

Actualisation d'un ancien sujet ..__ J'ai pu réaliser que mon activité ne se pliait pas lorsque le bouton d'accueil (physique ou virtuel) était enfoncé. Voici mon code pour la méthode activity onCreate():

super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm_screen);
        context = getApplicationContext();
        int windowType;
        if (Build.VERSION.SDK_INT>=26) windowType = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
        else windowType = WindowManager.LayoutParams.TYPE_TOAST;
        final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                windowType,
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                        | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                        | WindowManager.LayoutParams.FLAG_FULLSCREEN,
                PixelFormat.TRANSLUCENT
        );
        wm = (WindowManager) getApplicationContext()
                .getSystemService(Context.WINDOW_SERVICE);

        mTopView = (ViewGroup) getLayoutInflater().inflate(R.layout.activity_alarm_screen, null);
        getWindow().setAttributes(params);
        //Set up your views here
        testView = mTopView.findViewById(R.id.test);
        wm.addView(mTopView, params);

Sur les API 26 et suivantes, vous devez obtenir l'autorisation de superposition d'écran de l'utilisateur. Testé sur Android 7 et 8.

0
Dmitri Borohhov

Je travaille sur une application qui doit verrouiller la tablette uniquement pour l’application . Tout d’abord, je mets mon application en tant que MainLauncher, puis je verrouille la barre des tâches à l’aide d’un AndroidView . Enfin, je bloque la tablette . n’est pas une fonctionnalité que j’indique utiliser avec plusieurs modèles de tablette, car chaque modèle de périphérique dispose d’une fonctionnalité permettant de la bloquer.

Mais dans l’ensemble, cela fonctionne pour tout le monde . Vous pouvez utiliser les commandes 

Java.Lang.Runtime.GetRuntime().Exec("su -c sed -i '/VOLUME_UP/s/^# //g' /system/usr/keylayout/Generic.kl");

comme exemple pour désactiver les boutons. Mais tout est basé sur la modification des fichiers système, dans le dossier "/ system/usr/keylayout/..." . REMARQUE: ne fonctionne que sur les périphériques root.

Une autre façon que j'essaie, mais en cours de développement, consiste à utiliser StreamWrite et StreamReader pour accéder au répertoire RootDirectory et réécrire l'ensemble du fichier pour désactiver et activer les boutons.

J'espère que cela t'aides.

Et toutes les questions restent disponibles.

0
Renan Eberle Costella

Utiliser la rotation provoque une exception, j'ai donc corrigé mon activité en utilisant ceci:

HomeKeyLocker locker;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_splash);

    locker = new HomeKeyLocker();               
    locker.lock(this);
}

@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    locker.unlock();
}

@Override
public void onConfigurationChanged(Configuration config) {
    super.onConfigurationChanged(config);
    locker.lock(this);
}

Vous devrez utiliser la suggestion @ Lê Quang Duy.

0
Oscar Romero

Franchement, il n'est pas possible de désactiver le bouton d'accueil au moins sur les nouveaux niveaux d'API, c'est-à-dire à partir de 4.0. Il est également déconseillé de le faire. Vous pouvez toutefois bloquer le bouton Précédent en remplaçant le 

public void onBackPressed() {
    // do not call super onBackPressed.
}

afin de remplacer le bouton d'accueil, vous pouvez utiliser une minuterie par exemple, et après chaque fois, vérifiez si l'écran principal est votre écran ou pas, ou si votre paquet est au-dessus ou non (je suis sûr que vous obtiendrez des liens vers celui-ci ) et affichez votre activité à l’aide du drapeau single_top. 

Ainsi, même si vous appuyez sur le bouton d'accueil, vous pourrez amener votre application au sommet. 

Assurez-vous également que l'application dispose d'un moyen de quitter, car ce type d'applications peut être vraiment ennuyeux et ne doit jamais être développé.

Bonne codage.

P.S: Il n’est pas possible d’intercepter l’événement à domicile lorsque le bouton home est enfoncé.

Vous pouvez utiliser les méthodes attach to window et les méthodes keyguard, mais pas pour les niveaux d'api à partir de 4.0.

Poster ICS c’est-à-dire qu’Android 4+, la substitution du HomeButton a été supprimée pour des raisons de sécurité, afin de permettre à l'utilisateur de quitter le logiciel au cas où l'application s'avérerait être un malware.

De plus, ce n'est pas vraiment une bonne pratique de ne pas laisser l'utilisateur naviguer hors de l'application. Mais, puisque vous créez une application d'écran verrouillé, vous pouvez déclarer l'activité en tant que lanceur. Ainsi, lorsque vous appuyez sur le bouton HomeButton, il redémarre simplement votre application et y reste lui-même (les utilisateurs ne remarqueraient qu'un léger scintillement dans l'écran).

Vous pouvez passer par le lien suivant:

http://dharmendra4Android.blogspot.in/2012/05/override-home-button-in-Android.html

0
Rishabh Srivastava