¿Cómo deshabilitar los botones de inicio y otros botones del sistema en Android?

80

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?

user1024
fuente
1
stackoverflow.com/questions/17183905/… . no puede desactivar el botón de inicio.
Raghunandan
2
@ user1024 ¿ha encontrado alguna solución para su pregunta? Como también quiero hacer la misma funcionalidad que en MX Player.
Chirag Shah
2
La forma de MX Player es bastante interesante. En realidad, están impidiendo que la barra de navegación regrese.
nhaarman
¿Alguna vez encontró una solución a este problema? También necesito averiguar cómo desactivar estos botones. Como mínimo, ¿cómo puedo administrar el botón multitarea?
portfoliobuilder
Puede verificar mi respuesta, creo que lo ayudará a lograr lo que desea stackoverflow.com/a/28603790/3300883
Miguel

Respuestas:

91

En primer lugar, piense detenidamente si realmente desea deshabilitar el Homebotó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 Playerestá pidiendo permiso para dibujar sobre otras aplicaciones: MX Player permissions
ya que no puede anular el Homebotón en el Androiddispositivo (al menos no en las últimas versiones del sistema operativo). MX Playerse dibuja en la parte superior de su lanzador cuando "bloquea" la aplicación y hace clic en el Homebotó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 Bary Navigation 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, ocultar Status Bary Navigation Barno es solo para KitKat.

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!

Assaf Gamliel
fuente
1
Entonces, ¿cómo oculta la barra de navegación y evita que vuelva a aparecer cuando se toca la pantalla? Y cuando haces un movimiento de deslizamiento para salir del modo inmersivo, la barra de navegación se muestra y se oculta nuevamente de inmediato. Además, no es posible sacar el panel de notificaciones cuando está bloqueado, incluso cuando el "deslizamiento inmersivo" obliga a mostrar la barra de estado. ¿Como hace eso?
nhaarman
2
Está bien, esto ayuda mucho, pero todavía no hemos llegado allí. Voy a colocar dos comentarios, uno para KitKat y otro para Jelly Bean. Para KitKat, usando las banderas TYPE_SYSTEM_ALERT, SYSTEM_UI_FLAG_HIDE_NAVIGATIONy SYSTEM_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.
nhaarman
1
Para Jelly Bean (16+), IMMERSIVE_STICKYno funciona. Por lo tanto, es posible mostrar la barra de navegación (la barra de estado permanece oculta debido a SYSTEM_ALERT). Podemos detectar esto usando el OnSystemUiVisibilityChangeListener, 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 usa IMMERSIVE STICKY(aparecen barras en kitkat), pero las barras desaparecen nuevamente antes de que te des cuenta.
nhaarman
1
Github Gist para KitKat: gist.github.com/nhaarman/8291022 . Github Gist para Jelly Bean: gist.github.com/nhaarman/8291070 .
nhaarman
7
FYI Assaf, algunas aplicaciones DEBEN estar bloqueadas. Por ejemplo, aplicaciones de tipo quiosco donde el propietario permite el acceso temporal a la pieza de hardware. Estoy creando una aplicación de fotomatón en este momento, y no quiero que el usuario (la persona que se toma la foto) pueda hacer nada más que tomar una foto (y algunas otras cosas). El propietario puede desbloquearlo mediante un botón de software, pero de lo contrario debe cerrarse. Lo siento, pero su "consejo maternal" al comienzo de su respuesta me frotó (y estoy seguro de que otros, incluido el OP), me equivocaron. Sin embargo, gracias por tu respuesta, lo investigaré.
ntgCleaner
13

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.xmlTodo lo que tienes que hacer es copiar HomeKeyLocker.javade 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 .

Lê Quang Duy
fuente
¿Funciona en Android 4.4.4? Porque lo probé en mi Moto G que se ejecuta en 4.4.4. No funcionó para mí.
venkat
1
Esta biblioteca simplemente deshabilita el botón de inicio duro. Moto G tiene un botón de inicio suave, por lo que no funciona .. @ venkat
Harry Sharma
Una alerta es una buena solución, si no la mejor, pero tenga en cuenta que en algunos dispositivos (es decir, Nexus 4) esto no funcionará y el botón de inicio aún se puede usar.
JacksOnF1re
12

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.

shaobin0604
fuente
1
¡¡Esto solo deshabilita el botón de inicio duro ... !!
Harry Sharma
Funcionó perfectamente para mí. Probablemente quiera deshabilitar todos los botones físicos, en realidad ... Usar esto para Google Cardboard para deshabilitar el botón de Inicio, ya que mi caso lo golpea.
Matt Cruikshank
Cómo deshabilitar el botón de aplicaciones recientes
user3106818
# shaobin0604 Su código de github no funciona en el dispositivo Motorola.
Brajendra Pandey
11

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í :

Android 5.0 presenta una nueva API de fijación de pantalla que le permite restringir temporalmente a los usuarios para que no abandonen su tarea o sean interrumpidos por notificaciones. Esto podría usarse, por ejemplo, si está desarrollando una aplicación educativa para admitir requisitos de evaluación de alto riesgo en Android, o una aplicación de quiosco o de un solo propósito. Una vez que su aplicación activa la fijación de pantalla, los usuarios no pueden ver notificaciones, acceder a otras aplicaciones o regresar a la pantalla de inicio, hasta que su aplicación salga del modo.

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í .

tagy22
fuente
6

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

molnarm
fuente
Una prueba rápida, agregando el permiso y llamando 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.
nhaarman
No tengo el SDK ahora, pero mi próxima idea sería usar SYSTEM_UI_FLAG_HIDE_NAVIGATION junto con la captura de eventos táctiles / usar OnSystemUiVisibilityChangeListener para anular el comportamiento predeterminado (la barra de navegación aparece al tocar).
molnarm
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).
molnarm
4

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

Álvaro Cavalcanti
fuente
2
Acabo de probar el reproductor MX como él dijo en un Nexus 4, y realmente bloqueó el botón de inicio = S
Pozzo Apps
El botón de retroceso está diseñado para funcionar de la forma en que fue diseñado. Sugeriría no deshabilitar el botón de retroceso.
Raghunandan
Veo tu punto, @Raghunandan, y estoy de acuerdo con él. Aún así, el botón Atrás se puede desactivar y confío en que el desarrollador lo tendrá en cuenta. Si logra romper la usabilidad de su aplicación, sus usuarios se lo harán saber.
Alvaro Cavalcanti
intente instalar MX Player y pruébelo. Desactiva el botón INICIO. Deshabilita todos los botones del sistema. MX Player usa Kids Lock (complemento). Intenté desmontar Kids Lock (complemento) pero no tengo ni idea de cómo funciona todavía. Por eso hago esta pregunta.
user1024
1
Tenga en cuenta que esta respuesta no proporciona la forma en que mx player implementa esta función.
nhaarman
3

Si su objetivo es Android 5.0 y superior. Podrías usar:

Activity.startLockTask()
Lowolfne
fuente
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación; siempre puede comentar sus propias publicaciones y, una vez que tenga suficiente reputación , podrá comentar cualquier publicación . - De la revisión
user1140237
1
@ user1140237 ¿Por qué no?
Trilarion
1
Esto solo se puede hacer si eres un administrador de dispositivos, lo que una aplicación normal no debería ser
Ron
3

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 el onResume()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.

DalveerSinghDaiya
fuente
2

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_ERRORlugar de WindowManager.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.

aravindsagar
fuente
1

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;
}
Harshal Benake
fuente
2
La cuestión es imitar específicamente la funcionalidad del reproductor MX.
nhaarman
1

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.

Dmitri Borohhov
fuente
0

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;
}
CR Sardar
fuente
1
La cuestión es imitar específicamente la funcionalidad del reproductor MX.
nhaarman
0

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

Rishabh Srivastava
fuente
La cuestión es imitar específicamente la funcionalidad del reproductor MX.
nhaarman
0

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.

Rat-a-tat-a-tat Ratatouille
fuente
La cuestión es imitar específicamente la funcionalidad del reproductor MX.
nhaarman
@NiekHaarman, en realidad no. La pregunta es "desactivar Inicio, Atrás y todos los demás botones del sistema". Específicamente LIKE MX player, no MIMIC.
Adam
@adam no, la recompensa que puse en la pregunta que desencadenó esta respuesta fue específicamente para imitar la funcionalidad del reproductor MX.
nhaarman
0

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.

Oscar Romero
fuente
0

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.

Renan Eberle Costella
fuente
0

Para cualquiera que busque eliminar por completo el software de navegación en un dispositivo Android rooteado (o ROM personalizada) , puede modificar elbuild.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.

Le-roy Staines
fuente