Necesito deshabilitar los botones de inicio y otros botones del sistema en mi aplicación de Android.
Ejemplo: MX Player
( ver en Google Play ) - puede presionar el icono de "bloqueo" en la pantalla del reproductor y bloquea todos los botones del sistema de hardware y software.
Funciona bien SIN ENRAIZAR.
Lo probé en algunos dispositivos con diferentes versiones de Android. Intenté desmontar Kids Lock (complemento) pero no tengo ni idea de cómo funciona todavía.
Necesito la misma solución como Kids Lock (complemento) para MX Player
: - desactivar Inicio, Atrás y todos los demás botones del sistema.
¿Alguna sugerencia?
Respuestas:
En primer lugar, piense detenidamente si realmente desea deshabilitar el
Home
botón o cualquier otro botón (por ejemplo, elBack
botón), esto no es algo que deba hacerse (al menos la mayoría de las veces, este es un mal diseño ). Solo puedo hablar por mí mismo, pero si descargué una aplicación que no me permite hacer algo como hacer clic en un botón del sistema operativo, lo siguiente que hago es desinstalar esa aplicación y dejar una muy mala reseña. También creo que su aplicación no aparecerá en la App Store.Ahora...
Tenga en cuenta que
MX Player
está pidiendo permiso para dibujar sobre otras aplicaciones:ya que no puede anular el
Home
botón en elAndroid
dispositivo (al menos no en las últimas versiones del sistema operativo).MX Player
se dibuja en la parte superior de su lanzador cuando "bloquea" la aplicación y hace clic en elHome
botón.Para ver un ejemplo de que es un poco más simple y sencillo de entender, puede ver la aplicación Facebook Messenger .
Como se me pidió que proporcionara más información sobre MX Player
Status Bar
yNavigation Bar
"overriding", estoy editando mi respuesta para incluir estos temas también.Lo primero es lo primero, MX Player está usando el modo inmersivo de pantalla completa ( DevBytes Video )
KitKat
.Android 4.4 (API nivel 19) introduce un nuevo indicador SYSTEM_UI_FLAG_IMMERSIVE para setSystemUiVisibility () que permite que su aplicación funcione realmente en "pantalla completa". Esta bandera, cuando se combina con las banderas SYSTEM_UI_FLAG_HIDE_NAVIGATION y SYSTEM_UI_FLAG_FULLSCREEN , oculta las barras de navegación y de estado y permite que su aplicación capture todos los eventos táctiles en la pantalla.
Cuando se habilita el modo inmersivo de pantalla completa, su actividad continúa recibiendo todos los eventos táctiles. El usuario puede revelar las barras del sistema con un deslizamiento hacia adentro a lo largo de la región donde normalmente aparecen las barras del sistema. Esto borra el indicador SYSTEM_UI_FLAG_HIDE_NAVIGATION (y el indicador SYSTEM_UI_FLAG_FULLSCREEN , si se aplica) para que las barras del sistema sean visibles. Esto también activa su View.OnSystemUiVisibilityChangeListener , si está configurado. Sin embargo, si desea que las barras del sistema se oculten automáticamente nuevamente después de unos momentos, puede usar la marca SYSTEM_UI_FLAG_IMMERSIVE_STICKY . Tenga en cuenta que la versión "pegajosa" de la bandera no activa ningún oyente, ya que las barras del sistema que se muestran temporalmente en este modo están en un estado transitorio.
Segundo: Ocultar la barra de estado
Tercero: Ocultar la barra de navegación
Tenga en cuenta que aunque el uso de pantalla completa inmersiva es solo para
KitKat
, ocultarStatus Bar
yNavigation Bar
no es solo paraKitKat
.No tengo mucho que decir sobre el 2º y el 3º. Creo que me entiendes, es una lectura rápida en cualquier caso. Solo asegúrese de prestar mucha atención a View.OnSystemUiVisibilityChangeListener .
Agregué un Gist que explica lo que quise decir, no está completo y necesita algunas correcciones, pero entenderás la idea. https://gist.github.com/Epsiloni/8303531
¡Buena suerte implementando esto y diviértete!
fuente
TYPE_SYSTEM_ALERT
,SYSTEM_UI_FLAG_HIDE_NAVIGATION
ySYSTEM_UI_FLAG_IMMERSIVE_STICKY
, no hay manera de salir de la aplicación. Ambas barras del sistema permanecen ocultas. A menos que se abra el menú de energía. Luego, la barra de navegación aparece nuevamente, y el botón de inicio se vuelve funcional. MX Player logra mantener oculta la barra de navegación en ese caso. Entonces, para los dispositivos que ejecutan KitKat, aún tenemos que arreglar esto.IMMERSIVE_STICKY
no funciona. Por lo tanto, es posible mostrar la barra de navegación (la barra de estado permanece oculta debido aSYSTEM_ALERT
). Podemos detectar esto usando elOnSystemUiVisibilityChangeListener
, y habilitar las banderas nuevamente. Sin embargo, por alguna razón, esto solo funciona después de aproximadamente un segundo, que es tiempo más que suficiente para presionar el botón de inicio. MX Player no se usaIMMERSIVE STICKY
(aparecen barras en kitkat), pero las barras desaparecen nuevamente antes de que te des cuenta.Seguí las respuestas de shaobin0604 y finalmente logré bloquear el botón INICIO, añadiendo:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
to
AndroidManifest.xml
Todo lo que tienes que hacer es copiarHomeKeyLocker.java
de la biblioteca de shaobin a tu proyecto e implementarlo como en el ejemplo de shaobin . Por cierto: la versión de Android de mi AVD es Android 4.0.3 .fuente
Puede usar Android-HomeKey-Locker para deshabilitar la TECLA DE INICIO y otras teclas del sistema (como la TECLA ATRÁS y la TECLA DE MENÚ)
Espero que esto te ayude en tu aplicación. Gracias.
fuente
Puede deshabilitar el botón de inicio y recientes de Android 5.0, utilizando la función de fijación de pantalla que se menciona aquí :
Puede bloquear el dispositivo para que sea un quiosco. La barra de navegación no está oculta, pero los botones de inicio y recientes pueden eliminarse o desactivarse dependiendo de cómo active el modo. Escribí algo de información después de probar esta función aquí .
fuente
Solo una suposición, pero creo que con el permiso SYSTEM_ALERT_WINDOW (mostrado como "Dibujar sobre otras aplicaciones", ver aquí ) podría ser posible: mostrar su aplicación como una ventana de tipo de alerta del sistema en pantalla completa . De esta manera, ocultará cualquier otra aplicación, incluso la pantalla de inicio, por lo que si presiona Inicio, realmente no se desactivará, solo sin ningún efecto visible.
MX Player tiene este permiso declarado, y Facebook Messenger también lo tiene para mostrar " cabezas de chat " sobre cualquier cosa, por lo que podría ser la solución.
Actualización (agregada de mis comentarios): A continuación, use SYSTEM_UI_FLAG_HIDE_NAVIGATION junto con la captura de eventos táctiles / usando OnSystemUiVisibilityChangeListener para anular el comportamiento predeterminado (la barra de navegación aparece al tocar). Además, dado que dijiste que el gesto inmersivo de salida no funciona, puedes intentar configurar SYSTEM_UI_FLAG_IMMERSIVE_STICKY también (con SYSTEM_UI_FLAG_FULLSCREEN y SYSTEM_UI_FLAG_HIDE_NAVIGATION).
fuente
getWindow().addFlags(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
, muestra que esto ocultará la barra de estado (y el movimiento de deslizar hacia abajo como se usa para salir de la pantalla completa inmersiva no funciona), pero no la barra de navegación. Los botones de esta barra siguen funcionando.Solía ser posible desactivar el botón de inicio, pero ahora no lo es. Se debe a un software malintencionado que podría atrapar al usuario.
Puede ver más detalles aquí: Desactivar el botón Inicio en Android 4.0+
Finalmente, el botón Atrás se puede deshabilitar, como puede ver en esta otra pregunta: Deshabilitar el botón Atrás en Android
fuente
Si su objetivo es Android 5.0 y superior. Podrías usar:
Activity.startLockTask()
fuente
Primero crea un método:
public void hideNavigationBar() { final View decorView = this.getWindow().getDecorView(); final int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { YourActivityName.this.runOnUiThread(new Runnable() { @Override public void run() { decorView.setSystemUiVisibility(uiOptions); } }); } }; timer.scheduleAtFixedRate(task, 1, 2); }
Luego lo llama el
onCreate()
método de su actividad. Vuelva a llamarlo en elonResume()
método. Luego, puede agregar otro método en su actividad como este:@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); hideNavigationBar(); }
Eso será todo. Recuerde que bloqueará la pantalla hasta la próxima vez que el usuario toque la pantalla, en la clase Temporizador puede cambiar la demora y le permitirá cambiar las cosas para esa instancia.Luego bloqueará la pantalla nuevamente.
fuente
Yo también estuve buscando esto durante algún tiempo, y finalmente pude hacerlo como necesitaba, es decir, la barra de navegación es inaccesible, la barra de estado es inaccesible, incluso si mantiene presionado el botón de encendido, no se muestran ni el menú de encendido ni los botones de navegación. Gracias a @Assaf Gamliel, su respuesta me llevó al camino correcto. Seguí este tutorial con algunas ligeras modificaciones. Mientras especificaba el Tipo, especifiqué en
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR
lugar deWindowManager.LayoutParams.TYPE_PHONE
, de lo contrario, nuestra "superposición" no ocultará las barras del sistema. Puede jugar con las banderas, la altura, el ancho, etc. para que se comporte como desee.fuente
No sé cómo activar el botón de inicio. siempre que tenga conocimiento, tengo el siguiente enlace.
consulte el enlace: - http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_HOME
Constante de código de tecla: tecla de inicio. Esta clave la maneja el marco y nunca se entrega a las aplicaciones.
Pero, podemos activar el botón de retroceso. Espero que el siguiente código te ayude.
@Override public void onBackPressed() { //return nothing return; }
fuente
Refrescando un tema antiguo. Pude lograr que mi actividad no se doble cuando se presiona el botón de inicio (físico o virtual). Aquí está mi código para el
onCreate()
método de actividad :super.onCreate(savedInstanceState); setContentView(R.layout.activity_alarm_screen); context = getApplicationContext(); int windowType; if (Build.VERSION.SDK_INT>=26) windowType = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; else windowType = WindowManager.LayoutParams.TYPE_TOAST; final WindowManager.LayoutParams params = new WindowManager.LayoutParams( windowType, WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_FULLSCREEN, PixelFormat.TRANSLUCENT ); wm = (WindowManager) getApplicationContext() .getSystemService(Context.WINDOW_SERVICE); mTopView = (ViewGroup) getLayoutInflater().inflate(R.layout.activity_alarm_screen, null); getWindow().setAttributes(params); //Set up your views here testView = mTopView.findViewById(R.id.test); wm.addView(mTopView, params);
En API 26 y superior, debe obtener el permiso de superposición de pantalla del usuario. Probado en Android 7 y 8.
fuente
No puede deshabilitar el botón Inicio de ICS onwords, pero puede deshabilitar otros botones de la siguiente manera
@Override public boolean dispatchKeyEvent(KeyEvent keyEvent){ return true; }
fuente
Después de ICS, es decir, Android 4+, la anulación del HomeButton se ha eliminado por razones de seguridad, para permitir la salida del usuario en caso de que la aplicación resulte ser un malware.
Además, no es una buena práctica no permitir que el usuario navegue fuera de la aplicación. Pero, dado que está creando una aplicación de pantalla de bloqueo, lo que puede hacer es declarar la actividad como un Launcher, de modo que cuando se presione el HomeButton simplemente reiniciará su aplicación y permanecerá allí (los usuarios no notarían nada más que un ligero parpadeo en la pantalla).
Puede pasar por el siguiente enlace:
http://dharmendra4android.blogspot.in/2012/05/override-home-button-in-android.html
fuente
Francamente, no es posible deshabilitar el botón de inicio al menos en los nuevos niveles de API, es decir, a partir de 4.0. Tampoco es aconsejable hacer eso. Sin embargo, puede bloquear el botón Atrás anulando el
public void onBackPressed() { // do not call super onBackPressed. }
para anular el botón de inicio, puede usar un temporizador, por ejemplo, y después de cada vez, verifique si la pantalla principal es su pantalla o no, o si su paquete está en la parte superior o no (estoy seguro de que obtendrá enlaces a él ) y muestra tu actividad con la bandera single_top.
De esa manera, incluso si se presiona el botón de inicio, podrá llevar su aplicación a la parte superior.
También asegúrese de que la aplicación tenga una forma de salir, porque este tipo de aplicaciones pueden ser realmente molestas y nunca deben desarrollarse.
Codificación feliz.
PD: No es posible interceptar el evento de inicio cuando se presiona el botón de inicio.
Puede usar los métodos adjuntar a la ventana y también los métodos de protección de teclas, pero no para los niveles de API desde 4.0 en adelante.
fuente
El uso de la rotación causa una excepción, así que arreglé mi actividad usando esto:
HomeKeyLocker locker; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_splash); locker = new HomeKeyLocker(); locker.lock(this); } @Override protected void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); locker.unlock(); } @Override public void onConfigurationChanged(Configuration config) { super.onConfigurationChanged(config); locker.lock(this); }
Deberá utilizar la sugerencia de @ Lê Quang Duy.
fuente
Estoy trabajando en una aplicación que necesita bloquear la tableta solo para la aplicación. Primero coloco mi aplicación como MainLauncher, luego bloqueo la barra de tareas usando un AndroidView. Finalmente bloqueo la tableta. No es una función que indique que se utilice en varios modelos de tableta, ya que cada modelo de dispositivo tiene una función para bloquearla.
Pero, en general, funciona para todos. Puedes usar los comandos
Java.Lang.Runtime.GetRuntime().Exec("su -c sed -i '/VOLUME_UP/s/^# //g' /system/usr/keylayout/Generic.kl");
como ejemplo para desactivar los botones. Pero todo se basa en cambiar los archivos del sistema, dentro de la carpeta "/ system / usr / keylayout / ...". NOTA: Solo funciona en dispositivos rooteados.
Otra forma que estoy intentando, aunque todavía estoy en desarrollo, es usando StreamWrite y StreamReader para acceder a RootDirectory y reescribir todo el archivo para deshabilitar y habilitar los botones.
Espero que esto ayude.
Y cualquier pregunta permanece disponible.
fuente
Para cualquiera que busque eliminar por completo el software de navegación en un dispositivo Android rooteado (o ROM personalizada) , puede modificar el
build.prop
archivo de texto dentro de la carpeta del sistema.Establezca la siguiente variable / valor:
gemu.hw.mainkeys=1
Esto es lo que utilizan los proveedores para deshabilitar la navegación por software, cuando tienen botones físicos.
fuente
Perdón por responder después de 2-3 años. pero puede ocultar la actividad de todos los botones del sistema. Solo revisa esto mis respuestas ¿Cómo deshabilitar el botón de inicio virtual en cualquier actividad? .
fuente