Evitar que la barra de estado aparezca en Android (modificado)

Estoy implementando una aplicación en modo kiosco y he realizado satisfactoriamente la aplicación a pantalla completa sin apariencia de barra de estado posterior a 4.3 pero no puedo ocultar la barra de estado en 4.3 y 4.4 como barra de estado aparece cuando deslizamos hacia abajo en la parte superior de la pantalla.

He intentado hacerlo en pantalla completa

  • especificando el tema de pantalla completa en manifiesto
  • ventana de configuración Flags ie setFlags
  • setSystemUiVisibility

Posible solución duplicada pero no concreta encontrada

Permanentemente ocultar la barra de estado de Android

Finalmente, lo que quiero es, ¿cómo ocultar la barra de estado permanentemente en una actividad? en Android 4.3,4.4,5,6versions

No pudimos evitar que el estado apareciera en modo de pantalla completa en dispositivos kitkat, por lo que se creó un truco que aún se ajusta al requisito, es decir, impide que la barra de estado se expanda.

Para que eso funcione, la aplicación no se hizo a pantalla completa. Pusimos una superposición sobre la barra de estado y consumimos todos los eventos de entrada. Impidió que el estado se expandiera.

Nota:

  • customViewGroup es una clase personalizada que amplía cualquier diseño (fotogtwig, diseño relativo, etc.) y consume eventos táctiles.
  • consumir evento táctil anula el método onInterceptTouchEvent del grupo de vista y devuelve true

Actualizado

 

Implementación de CustomViewGroup

Código:

 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); 

En Android M, tienes que obtener un permiso adicional para hacer superposiciones. android.permission.SYSTEM_ALERT_WINDOW no es suficiente! Así que utilicé el código de la respuesta de Abhimaan dentro de disableStatusBar() y tuve que intentar abrir el cuadro de diálogo de configuración correcto. También agregué quitar vista en onDestroy() para habilitar la barra de estado cuando la aplicación sale. También reduje la altura de superposición a 40, ya que parece ser suficiente. El código funciona con 5.1 y 6.0 aquí.

 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); }