programacion - Evitar que la barra de estado aparezca en Android(modificado)
manual de android en pdf (2)
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);
}
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 (fotograma, 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
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
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);