Bloquear / deshabilitar barra de estado en android Tablet / Mobile

He visto aplicaciones de Kioware y SureLock. Simplemente bloquean todos los controles de la tableta. Estoy enterado sobre el botón de la cancelación trasero y el manejo del hogar y de las opciones recientes de la tarea también. Pero no estoy seguro de cómo lograron controlar la opción de configuración en la barra del sistema. Los ajustes aparecen durante una fracción de segundos y luego desaparecen. De la misma manera Barra de estado de móvil que aparecen en el golpe hacia abajo necesidad de bloquear.

Si alguien tiene idea acerca de ello, por favor comparta. Cualquier orientación / ayuda es apreciada.

Vea la parte seleccionada de la imagen adjunta que necesito bloquear / deshabilitar

El truco consiste en añadir una vista personalizada transparente que se superponga en la barra del sistema , de esta manera toda la interacción del usuario como toque, arrastrar será consumida por la vista personalizada.

Aquí está un código de trabajo:

windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); statusBarOverlay = new CustomViewGroup(this); final 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) (50 * getResources().getDisplayMetrics().scaledDensity); localLayoutParams.format = PixelFormat.TRANSPARENT; windowManager.addView(statusBarOverlay, localLayoutParams); 

ViewGroup personalizado:

 public class CustomViewGroup extends ViewGroup { public CustomViewGroup(Context context) { super(context); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return true; } } 

Yo mismo he hecho característica de bloqueo a mi aplicación aunque he separado la característica de bloqueo en una aplicación diferente por muchas razones. Puede pedir más información y los pondré aquí si es necesario.

Puede intentar agregar una View transparente en la posición desiderada mediante WindowManager (siga este ejemplo). De esta manera, interceptará cualquier evento de toque del usuario.

Asegúrese de establecer los indicadores / tipo adecuados , ya que es necesario superponer las barras del sistema:

  WindowManager.LayoutParams dismissParams = new WindowManager.LayoutParams( viewWidth, viewHeight, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, //you can also try with TYPE_SYSTEM_OVERLAY, TYPE_SYSTEM_ERROR WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, PixelFormat.TRANSPARENT); 

Finalmente encontré la solución del problema anterior. OnWindowFocus cambio Acabo de cerrar el sistema generado Diálogos y mi problema se resolvió. A continuación se muestra el código de ejemplo.

 @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(!hasFocus) {// Close every kind of system dialog Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); sendBroadcast(closeDialog); } } 

Actualizar:

En Mobile, para bloquear la barra de estado que aparece al deslizar el dedo hacia abajo en la pantalla, use la siguiente forma.

 private Handler collapseNotificationHandler; @Override public void onWindowFocusChanged(boolean hasFocus) { boolean currentFocus = hasFocus; if (!hasFocus) { collapseNow(true,currentFocus); } } public void collapseNow(final boolean shouldCollapse, final boolean currentFocus ) { // Initialize 'collapseNotificationHandler' if (collapseNotificationHandler == null) { collapseNotificationHandler = new Handler(); } // If window focus has been lost && activity is not in a paused state // Its a valid check because showing of notification panel // steals the focus from current activity's window, but does not // 'pause' the activity if (!currentFocus && !isPaused) { // Post a Runnable with some delay - currently set to 50 ms collapseNotificationHandler.postDelayed(new Runnable() { @Override public void run() { // Use reflection to trigger a method from 'StatusBarManager' Object statusBarService = getSystemService("statusbar"); Class<?> statusBarManager = null; try { statusBarManager = Class.forName("android.app.StatusBarManager"); } catch (ClassNotFoundException e) { e.printStackTrace(); } Method collapseStatusBar = null; try { // Prior to API 17, the method to call is 'collapse()' // API 17 onwards, the method to call is `collapsePanels()` if (Build.VERSION.SDK_INT > 16) { collapseStatusBar = statusBarManager.getMethod("collapsePanels"); } else { collapseStatusBar = statusBarManager.getMethod("collapse"); } } catch (NoSuchMethodException e) { e.printStackTrace(); } collapseStatusBar.setAccessible(shouldCollapse); try { collapseStatusBar.invoke(statusBarService); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } // Check if the window focus has been returned // If it hasn't been returned, post this Runnable again // Currently, the delay is 50 ms. You can change this // value to suit your needs. if (!currentFocus && !isPaused) { collapseNotificationHandler.postDelayed(this, 50); } } }, 0); } } 

"IsPaused" booleano que establece true cuando la aplicación está en estado Pausa.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.