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

25
demandé sur Community 2014-08-13 14:51:56

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"/> 

customViewGroup mise en œuvre

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);
83
répondu Abhimaan 2015-04-02 05:45:36

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);
}
16
répondu Alexey Ozerov 2016-04-12 18:47:34