Empêcher la barre d'État pour apparaître android (modifié)
J'implémente une application en mode kiosque et j'ai réussi à faire l'application en plein écran sans affichage de la barre d'état 4.3 mais incapable de masquer la barre d'état dans 4.3 et 4.4 car la barre d'état apparaît lorsque nous glissons vers le bas en haut de l'écran.
J'ai essayé de faire en plein écran par
- spécifier le thème Plein écran dans le manifeste
- Définition des drapeaux de fenêtre ie setFlags
- setSystemUiVisibility
Doublon Possible mais non solution concrète trouvée
Masquer définitivement la barre D'État Android
Enfin, la chose que je veux est, comment masquer la barre d'état en permanence dans une activité?? dans Android 4.3, 4.4, 5, 6 versions
2 réponses
Nous ne pouvions pas empêcher le statut apparaissant en mode plein écran dans les appareils kitkat, donc fait un hack qui convient toujours à l'exigence à savoir bloquer la barre d'état de l'expansion.
Pour que cela fonctionne, l'application n'a pas été faite en plein écran. Nous avons mis une superposition sur la barre d'état et consommé tous les événements d'entrée. Cela a empêché le statut de s'étendre.
note:
- customViewGroup est une classe personnalisée qui étend mise en page(cadre,mise en page relative, etc.) et consomme événement tactile.
- pour consommer l'événement tactile, remplacez la méthode onInterceptTouchEvent de le groupe de vue et le retour true
Mise à Jour
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
Code:
WindowManager manager = ((WindowManager) getApplicationContext()
.getSystemService(Context.WINDOW_SERVICE));
WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams();
localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
localLayoutParams.gravity = Gravity.TOP;
localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
// this is to enable the notification to recieve touch events
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
// Draws over status bar
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
localLayoutParams.height = (int) (50 * getResources()
.getDisplayMetrics().scaledDensity);
localLayoutParams.format = PixelFormat.TRANSPARENT;
customViewGroup view = new customViewGroup(this);
manager.addView(view, localLayoutParams);
Android M, vous devez obtenir une autorisation supplémentaire pour faire des superpositions. {[1] } ne suffit pas! J'ai donc utilisé le code de la réponse D'Abhimaan dans disableStatusBar()
et j'ai dû faire une intention d'ouvrir la bonne boîte de dialogue des paramètres. J'ai également ajouté la suppression de la vue dans onDestroy()
afin d'activer la barre d'état lorsque l'application se ferme. J'ai également réduit la hauteur de superposition à 40 car cela semble suffisant. Le Code fonctionne avec 5.1 et 6.0 ici.
public static final int OVERLAY_PERMISSION_REQ_CODE = 4545;
protected CustomViewGroup blockingView = null;
@Override
protected void onDestroy() {
super.onDestroy();
if (blockingView!=null) {
WindowManager manager = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE));
manager.removeView(blockingView);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(this)) {
Toast.makeText(this, "Please give my app this permission!", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
} else {
disableStatusBar();
}
}
else {
disableStatusBar();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == OVERLAY_PERMISSION_REQ_CODE) {
if (!Settings.canDrawOverlays(this)) {
Toast.makeText(this, "User can access system settings without this permission!", Toast.LENGTH_SHORT).show();
}
else
{ disableStatusBar();
}
}
}
protected void disableStatusBar() {
WindowManager manager = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE));
WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams();
localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
localLayoutParams.gravity = Gravity.TOP;
localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
// this is to enable the notification to receive touch events
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
// Draws over status bar
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
localLayoutParams.height = (int) (40 * getResources().getDisplayMetrics().scaledDensity);
localLayoutParams.format = PixelFormat.TRANSPARENT;
blockingView = new CustomViewGroup(this);
manager.addView(blockingView, localLayoutParams);
}