Comment désactiver les boutons Home et autres dans Android?
je dois désactiver la maison et d'autres boutons système dans mon application Android.
exemple: MX Player
( voir sur Google Play ) - vous pouvez appuyer sur l'icône" verrouiller " à l'écran du lecteur et il verrouille tous les boutons du système matériel et logiciel.
ça marche très bien sans enracinement.
Je l'ai testé sur certains appareils avec différentes versions Android. J'ai essayé de démonter Kids Lock. (plugin) mais ne sait pas encore comment cela fonctionne.
j'ai besoin de la même solution que le Kids Lock (plugin) pour MX Player
:
- désactivez les boutons Home, Back et tous les autres.
des suggestions?
18 réponses
tout d'abord, s'il vous plaît penser longtemps et dur si vous voulez vraiment désactiver le bouton Home
ou tout autre bouton pour cette question (par exemple, le bouton Back
), ce n'est pas quelque chose qui doit être fait (au moins la plupart du temps, il s'agit d'une mauvaise conception). Je ne peux parler que pour moi-même, mais si j'ai téléchargé une application qui ne me laisse pas faire quelque chose comme cliquer un bouton OS, la prochaine chose que je fais est désinstaller cette application et laisser un très mauvais avis. Je crois aussi que votre application ne sera pas en vedette sur L'App Store.
maintenant...
Avis MX Player
est de demander la permission de dessiner sur les autres applications:
Puisque vous ne pouvez pas surcharger le bouton Home
sur le périphérique Android
(au moins pas dans les dernières versions D'OS). MX Player
se dessine sur le dessus de votre lanceur lorsque vous" verrouiller "l'application et clique sur le bouton Home
.
De voir un exemple de ce qui est un peu plus simple et facile à comprendre, vous pouvez voir la Facebook Messenger .
comme on m'a demandé de fournir plus d'information sur le lecteur MX Status Bar
et Navigation Bar
" overriding", je suis en train de modifier ma réponse pour inclure ces sujets aussi.
tout d'abord, le lecteur MX utilise mode plein écran immersif ( DevBytes Video ) sur KitKat
.
Android 4.4 (API Niveau 19) introduit un nouveau drapeau SYSTEM_UI_FLAG_IMMERSIVE pour setSystemUiVisibility () qui permet à votre application de passer vraiment "plein écran."Ce drapeau, lorsqu'il est combiné avec les drapeaux SYSTEM_UI_FLAG_HIDE_NAVIGATION et SYSTEM_UI_FLAG_FULLSCREEN , cache les barres de navigation et d'état et permet à votre application de capturer tous les événements tactiles sur le é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 du système avec un balayage vers l'intérieur le long de la région où les barres du système apparaissent normalement. Cela efface le drapeau SYSTEM_UI_FLAG_HIDE_NAVIGATION (et le drapeau SYSTEM_UI_FLAG_FULLSCREEN , le cas échéant) de sorte que les barres du système deviennent visibles. Cela déclenche également votre Vue.OnSystemUiVisibilityChangeListener , si défini. Cependant, si vous souhaitez que les barres système se cachent de nouveau automatiquement après quelques instants, vous pouvez utiliser le drapeau SYSTEM_UI_FLAG_IMMERSIVE_STICKY . Notez que la version" sticky " du drapeau ne déclenche pas d'écouteurs, car les barres système Temporairement affichées dans ce mode sont dans un état transitoire.
Second: Cacher la barre D'État
Troisième: Cacher la barre de Navigation
S'il vous plaît noter que bien que l'utilisation du plein écran immersif est seulement pour KitKat
, cacher le Status Bar
et Navigation Bar
n'est pas seulement pour KitKat
.
Je n'ai pas grand chose à dire sur le 2ème et 3ème, Vous avez l'idée que je crois, c'est une lecture rapide dans tous les cas. Assurez-vous d'être attentif à la vue .OnSystemUiVisibilityChangeListener .
j'ai ajouté un Gist qui explique ce que je voulais dire, il n'est pas complet et a besoin d'un peu de réparation, mais vous aurez l'idée. https://gist.github.com/Epsiloni/8303531
Bonne chance la mise en œuvre de cette, et amusez-vous!
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" />
à AndroidManifest.xml
Tout ce que vous avez à faire est de copier HomeKeyLocker.java
à partir de shaobin lib à votre projet et à le mettre en œuvre comme dans shaobin l'exemple de . BTW: la version Android de mon AVD est Android 4.0.3 .
vous pouvez utiliser Android-HomeKey-Locker pour désactiver la clé de la maison et d'autres clés du système (telles que la clé arrière et la clé de MENU)
Espérons que cela vous aidera dans votre application. Grâce.
vous pouvez désactiver le bouton home and recents Android 5.0, en utilisant la fonction d'épinglage d'écran mentionnée ici :
Android 5.0 présente une nouvelle API de épinglage d'écran qui vous permet restreindre temporairement les utilisateurs de quitter votre tâche ou d'être interrompu par des notifications. Cela pourrait être utilisé, par exemple, si vous êtes développer une application d'éducation pour soutenir l'évaluation des enjeux élevés exigences sur Android, ou un service à usage unique ou de l'application du kiosque. Une fois votre application activée, les utilisateurs ne peuvent plus voir notifications, accéder à d'autres applications, ou revenir à l'écran d'accueil, jusqu'à votre app sort du mode.
vous pouvez verrouiller l'appareil pour être un kiosque. La barre de navigation n'est pas cachée, mais les boutons home et recents peuvent être supprimés ou désactivés selon la façon dont vous activez le mode. J'ai écrit quelques informations après avoir testé cette fonctionnalité ici .
juste une supposition, mais je pense qu'avec la permission SYSTEM_ALERT_WINDOW (affichée sous" Draw over other apps", voir ici ) il pourrait être possible: affichez votre application en plein écran, type d'alerte système fenêtre. De cette façon, il va cacher toutes les autres applications, même l'écran d'accueil donc si vous appuyez sur la maison, il ne sera pas vraiment être désactivé, juste sans aucun effet visible.
MX Player a cette permission a déclaré, et le messager Facebook l'a aussi pour afficher " têtes de chat " sur n'importe quoi - donc il pourrait être la solution.
mise à Jour (ajout de mes commentaires): Ensuite, utilisez SYSTEM_UI_FLAG_HIDE_NAVIGATION en conjonction avec la capture d'événements tactiles/à l'aide de OnSystemUiVisibilityChangeListener pour remplacer le comportement par défaut (barre de navigation figurant sur touch). Aussi, puisque vous avez dit que le geste immersif de sortie ne fonctionne pas, vous pourrait essayer de définir SYSTEM_UI_FLAG_IMMERSIVE_STICKY aussi (avec SYSTEM_UI_FLAG_FULLSCREEN et SYSTEM_UI_FLAG_HIDE_NAVIGATION).
il était possible de désactiver le bouton Home, mais maintenant il ne l'est plus. C'est dû à un logiciel malveillant qui pourrait piéger l'utilisateur.
vous pouvez voir plus de détails ici: bouton Désactiver la maison dans Android 4.0+
enfin, le bouton arrière peut être désactivé, comme vous pouvez le voir dans cette autre question: bouton arrière désactivé dans android
moi aussi j'ai été à la recherche pour cela pendant un certain temps, et finalement j'ai pu le faire comme j'avais besoin, c'est-à-dire la barre de Navigation est inaccessible, la barre d'état est inaccessible, même si vous appuyez sur le bouton de puissance, ni le menu de puissance ni les boutons de navigation ne sont affichés. Grâce à @Assaf Gamliel, sa réponse m'a mené sur la bonne voie.
J'ai suivi ce "tutoriel avec quelques légères modifications. En spécifiant le Type, j'ai spécifié WindowManager.LayoutParams.TYPE_SYSTEM_ERROR
au lieu de WindowManager.LayoutParams.TYPE_PHONE
, sinon notre "superposition" ne cache pas les barres du système. Vous pouvez jouer avec les drapeaux, la hauteur, la largeur, etc. pour qu'il se comporte comme vous le voulez.
si vous ciblez android 5.0 et plus. Vous pouvez utiliser:
Activity.startLockTask()
Je ne sais pas comment activer le bouton Accueil. aussi longtemps que je sache, j'ai eu le lien suivant.
refer the link: - http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_HOME
constante de code clé: clé D'origine. Cette clé est gérée par le cadre et n'est jamais transmise aux applications.
mais, on peut faire le bouton arrière. j'espère que le code suivant vous aidera.
@Override
public void onBackPressed() {
//return nothing
return;
}
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);
}
alors vous l'appelez sur onCreate()
méthode de votre activité.
Rappelez-le avec la méthode onResume()
.
Vous pouvez alors ajouter une autre méthode dans votre activité comme ceci:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
hideNavigationBar();
}
ce sera tout. Rappelez-vous, il va verrouiller l'écran jusqu'à la prochaine fois que l'utilisateur touche l'écran, dans la classe Timer vous pouvez changer le délai et il vous permettra de changer les choses de cette instance.Ensuite, il va verrouiller l' à nouveau à l'écran.
vous ne pouvez pas désactiver le bouton Home de ICS onwords mais pouvez désactiver les autres boutons comme suit
@Override
public boolean dispatchKeyEvent(KeyEvent keyEvent){
return true;
}
Post ICS i.e. Android 4+, le surpassement du bouton D'accueil a été supprimé pour des raisons de sécurité, pour permettre à l'utilisateur de sortir au cas où l'application se révèle être un malware.
Plus, ce n'est pas vraiment une bonne pratique de ne pas laisser l'utilisateur naviguer loin de l'application. Mais, puisque vous faites une application d'écran de verrouillage, ce que vous pouvez faire est de déclarer l'activité comme un lanceur , de sorte que lorsque le bouton D'accueil est pressé il redémarrera simplement votre application et rester là-bas (les utilisateurs ne remarqueraient rien d'autre qu'un léger clignotement dans l'écran).
Vous pouvez passer par le lien suivant:
http://dharmendra4android.blogspot.in/2012/05/override-home-button-in-android.html
franchement , il n'est pas possible de désactiver le bouton home au moins sur les nouveaux niveaux d'api, c'est-à-dire à partir de 4.0. Il n'est pas non plus conseillé de le faire. Vous pouvez cependant bloquer le bouton back en remplaçant le
public void onBackPressed() {
// do not call super onBackPressed.
}
afin d'Outrepasser le bouton d'accueil, vous pouvez utiliser une minuterie par exemple, et après chaque fois vérifier si l'écran principal est votre écran ou pas, ou votre paquet est dessus ou pas, (je suis sûr que vous obtiendrez des liens vers elle), et afficher votre l'activité en utilisant le drapeau single_top.
de Cette façon , même si le bouton est enfoncé, vous serez en mesure d'apporter votre application vers le haut.
également s'assurer que l'application a un moyen de sortir, parce que ce genre d'applications peuvent vraiment être ennuyeux et ne devrait jamais être développé.
Heureux de codage.
P. S: il n'est pas possible d'intercepter l'événement home, lorsque le bouton home est appuyé.
You peut utiliser les méthodes on attach to window et keyguard, mais pas pour les niveaux api à partir de 4.0.
utilisant la rotation provoque une exception, donc j'ai 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 de @Lê Quang duy.
rafraîchir un vieux sujet.
J'ai pu réaliser que mon activité ne se replie pas quand on appuie sur le bouton d'accueil (physique ou virtuel). Voici mon code pour l'activité onCreate()
méthode:
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 API 26 et aboveem vous devez obtenir l'autorisation de superposition d'écran de l'utilisateur. Testé sur Android 7 et 8.
je travaille sur une application qui doit verrouiller la tablette juste pour l'application. D'abord, j'ai mis mon application comme MainLauncher, puis j'ai verrouillé la barre des tâches en utilisant AndroidView. Enfin je bloque la tablette. Ce n'est pas une fonctionnalité que j'indique d'utiliser à travers plusieurs modèles de tablette, puisque chaque modèle d'appareil a une fonctionnalité pour la bloquer.
mais dans l'ensemble ça marche 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, à l'intérieur du dossier "/ system / usr / keylayout / ...". NOTE: ne fonctionne que sur les dispositifs enracinés.
une autre façon que j'essaie de développer est d'utiliser StreamWrite et StreamReader pour accéder au répertoire RootDirectory et réécrire tout le fichier pour désactiver et activer les boutons.
Espérons que cette aide.
et toutes les questions restent disponibles.
pour tous ceux qui cherchent à supprimer complètement le soft-nav sur un appareil android, vous pouvez modifier le build.prop
fichier texte dans le dossier système.
fixe la variable / valeur suivante:
gemu.hw.mainkeys=1
C'est ce que les vendeurs utilisent pour désactiver le soft nav, quand ils ont des boutons physiques.
Désolé d'avoir répondu après 2-3 ans. mais vous pouvez cacher l'activité de tous les boutons du système. Il suffit de vérifier ceci mes réponses comment désactiver le bouton Accueil virtuel dans toute activité? .