Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Deshabilitar el panel de notificación de ser derribado

Estoy trabajando en una aplicación de lockscreen y necesito deshabilitar la capacidad de desplegar la notificación / barra de estado en la parte superior de la pantalla. Hay una aplicación llamada Holo Locker y lo que hace esta aplicación es cuando el usuario se desplaza desde la parte superior de la pantalla, simplemente establece la barra de nuevo a la parte superior de la pantalla y lo que hace imposible tirar del cajón hacia abajo.

No tengo ni idea por dónde empezar. Cualquier ayuda sería genial! ¡Gracias!

  • ¿Cómo decir que la actividad ha sido cubierta por el área de notificación?
  • ¿Cómo puedo abrir / cerrar programáticamente notificaciones en Android?
  • ¿Puedo forzar la ampliación de la notificación android en android 4.1+?
  • 5 Solutions collect form web for “Deshabilitar el panel de notificación de ser derribado”

    Esto es posible mediante la reflexión. Hay un montón de problemas sin embargo.

    No hay forma de comprobar si el panel de notificaciones está abierto o abierto. Por lo tanto, tendremos que confiar en Activity#onWindowFocusChanged(boolean) . Y aquí es donde empiezan los problemas.

    Qué hace el método:

    Public void onWindowFocusChanged (booleano hasFocus)

    Se llama cuando la Ventana actual de la actividad gana o pierde foco. Este es el mejor indicador de si esta actividad es visible para el usuario.

    Por lo tanto, tendremos que averiguar una manera de distinguir entre la pérdida de enfoque debido a la presentación del panel de notificación, y la pérdida de enfoque debido a otros eventos.

    Algunos eventos que desencadenan onWindowFocusChanged(boolean) :

    • El foco de la ventana se pierde cuando una actividad se envía al fondo (aplicaciones de conmutación de usuarios o pulsando el botón de home )

    • Dado que los cuadros de diálogo y ventanas emergentes se abren en sus propias ventanas separadas, el foco de la ventana de la actividad se perderá cuando se muestren.

    • Otra instancia en la que la ventana de la actividad perderá el foco es cuando se hace clic en una ruleta, mostrando una Ventana Popup.

    Su actividad puede no tener que lidiar con todos estos problemas. El ejemplo siguiente maneja un subconjunto de ellos:

    En primer lugar, necesita el permiso EXPAND_STATUS_BAR :

     <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" /> 

    A continuación, declare estas variables de ámbito de clase en su actividad:

     // To keep track of activity's window focus boolean currentFocus; // To keep track of activity's foreground/background status boolean isPaused; Handler collapseNotificationHandler; 

    Anulación onWindowFocusChanged(boolean) :

     @Override public void onWindowFocusChanged(boolean hasFocus) { currentFocus = hasFocus; if (!hasFocus) { // Method that handles loss of window focus collapseNow(); } } 

    Definir collapseNow() :

     public void collapseNow() { // 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 300 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(true); 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 100 ms. You can change this // value to suit your needs. if (!currentFocus && !isPaused) { collapseNotificationHandler.postDelayed(this, 100L); } } }, 300L); } } 

    Maneje onPause() la actividad onPause() y onResume() :

     @Override protected void onPause() { super.onPause(); // Activity's been paused isPaused = true; } @Override protected void onResume() { super.onResume(); // Activity's been resumed isPaused = false; } 

    Espero que esto está cerca de lo que estás buscando.

    Nota: El parpadeo que sucede cuando se desliza la barra de notificación y se aferran a ella es, por desgracia, inevitable. Sin embargo, su apariencia puede ser controlada o mejorada utilizando valores "mejores" para los retrasos del manejador. Este problema también está presente en la aplicación Holo Locker.

    Si sólo desea evitar que el usuario abra el estado, pruebe esto:

     getWindow().addFlags(WindowManager.LayoutParams.[TYPE_SYSTEM_OVERLAY][1]); 

    Uso:

     super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY); setContentView(R.layout.your_layout); 

    Añadir antes Según su necesidad específica, puede elegir un WindowManager.LayoutParams adecuado.

    Espero que esto ayude.

    He intentado la respuesta aceptada, pero todavía era capaz de tirar hacia abajo y cambiar rápidamente algunos ajustes.

    Hay una solución diferente que impide que el usuario tire del menú completamente, lo cual preferí a la respuesta aceptada aquí.

      private void disablePullNotificationTouch() { 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) (25 * getResources() .getDisplayMetrics().scaledDensity); localLayoutParams.format = PixelFormat.RGBX_8888; customViewGroup view = new customViewGroup(this); manager.addView(view, localLayoutParams); } //Add this class in your project 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) { Log.v("customViewGroup", "**********Intercepted"); return true; } //Add this class in your project 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) { Log.v("customViewGroup", "**********Intercepted"); return true; } } 

    Eso suena como una idea absolutamente genial. Estarías rompiendo la funcionalidad predeterminada del sistema operativo que el usuario espera que esté allí. Afortunadamente no creo que sea posible, pero logras algo similar haciendo tu actividad FullScreen.

     public class FullScreen extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); } } 

    Hágame saber si usted encuentra una solución mejor que esto, estaré deseoso de saber eso.

    Gracias.

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