studio programacion herramientas fundamentos con avanzado aplicaciones android locking kiosk

programacion - manual de android en pdf



¿Cómo deshabilitar Inicio y otros botones del sistema en Android? (18)

Después de ICS, es decir, Android 4+, la anulación del HomeButton se ha eliminado por razones de seguridad, para permitir al usuario salir en caso de que la aplicación resulte ser un malware.

Además, no es una buena práctica dejar que el usuario se aparte de la aplicación. Pero, como está haciendo una aplicación de bloqueo de pantalla, lo que puede hacer es declarar la actividad como un Iniciador, de modo que cuando se presione el botón Inicio, simplemente reinicie su aplicación y permanezca allí (los usuarios notarían nada más que un ligero parpadeo). en la pantalla).

Puede ir a través del siguiente enlace:

http://dharmendra4android.blogspot.in/2012/05/override-home-button-in-android.html

Necesito desactivar Inicio y otros botones del sistema en mi aplicación Android.

Ejemplo: MX Player ( mira en Google Play ): puedes presionar el ícono "bloquear" en la pantalla del jugador y bloquear 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 aún no tengo idea de cómo funciona.

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?


En primer lugar, piense detenidamente si realmente desea deshabilitar el botón Home o cualquier otro botón para ese asunto (por ejemplo, el botón Back ), 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 crítica. También creo que su aplicación no aparecerá en la App Store.

Ahora...

Observe que MX Player está pidiendo permiso para dibujar sobre otras aplicaciones:
Ya que no puede anular el botón Home en el dispositivo Android (al menos no en las últimas versiones del sistema operativo). MX Player dibuja encima de su iniciador cuando "bloquea" la aplicación y hace clic en el botón Home .
Para ver un ejemplo de eso es un poco más simple y sencillo de entender, puedes ver la aplicación Facebook Messenger .

Como me pidieron que proporcionase más información acerca de la Status Bar reproductor MX y la Navigation Bar "anulando", estoy editando mi respuesta para incluir estos temas también.

Lo primero es que MX Player está utilizando el modo inmersivo de pantalla completa ( DevBytes Video ) en KitKat .
Android 4.4 (Nivel de API 19) introduce un nuevo indicador SYSTEM_UI_FLAG_IMMERSIVE para setSystemUiVisibility() que permite que su aplicación se setSystemUiVisibility() realmente en "pantalla completa". Este indicador, cuando se combina con los SYSTEM_UI_FLAG_HIDE_NAVIGATION y SYSTEM_UI_FLAG_FULLSCREEN , oculta las barras de navegación y estado, y permite que su aplicación capture todos los eventos táctiles en la pantalla.

Cuando el modo inmersivo de pantalla completa está habilitado, 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 corresponde) para que las barras del sistema se vuelvan visibles. Esto también activa su View.OnSystemUiVisibilityChangeListener , si está configurado. Sin embargo, si desea que las barras del sistema se oculten automáticamente de nuevo después de unos momentos, puede usar el indicador SYSTEM_UI_FLAG_IMMERSIVE_STICKY . Tenga en cuenta que la versión "adhesiva" de la marca no activa ningún oyente, ya que las barras del sistema que se muestran temporalmente en este modo se encuentran en estado transitorio.

Segundo: ocultar la barra de estado
Tercero: Ocultar la barra de navegación
Tenga en cuenta que, si bien utilizar la pantalla completa inmersiva es solo para KitKat , ocultar la Status Bar y la Navigation Bar no es solo para KitKat .

No tengo mucho que decir sobre el 2º y el 3º. Se entiende la idea, creo que 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!


Estoy trabajando en una aplicación que necesita bloquear la tableta solo para la aplicación. Primero pongo mi aplicación como MainLauncher, luego bloqueo la barra de tareas usando AndroidView. Finalmente bloqueo la tableta. No es una característica que indique utilizar en varios modelos de tabletas, ya que cada modelo de dispositivo tiene una función para bloquearlo.

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 un ejemplo para deshabilitar 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 en la que intento, aunque todavía estoy desarrollando, es usar StreamWrite y StreamReader para acceder a RootDirectory y volver a escribir todo el archivo para deshabilitar y habilitar los botones.

Espero que esto ayude.

Y cualquier pregunta queda disponible.


Francamente, no es posible desactivar el botón de inicio al menos en nuevos niveles de API, es decir, de 4.0 en adelante. 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, podría usar un temporizador, por ejemplo, y después de cada vez verificar si la pantalla principal es su pantalla o no, o su paquete está en la parte superior o no, (estoy seguro de que obtendrá enlaces a él) ), y muestre su actividad usando la bandera single_top.

De esta forma, incluso si presiona el botón de inicio, podrá llevar su aplicación a la cima.

También asegúrese de que la aplicación tenga una forma de salir, ya que ese tipo de aplicaciones realmente pueden ser molestas y nunca deben desarrollarse.

Feliz codificación.

PD: No es posible interceptar el evento en casa, cuando se presiona el botón de inicio.

Puede usar los métodos de adjuntar a ventana y también los métodos de bloqueo de teclas, pero no para los niveles de api desde 4.0 en adelante.


No puede deshabilitar el botón Inicio de las palabras clave de ICS, pero puede deshabilitar otros botones de la siguiente manera

@Override public boolean dispatchKeyEvent(KeyEvent keyEvent){ return true; }


No sé cómo marcar el botón de inicio. siempre que mi conocimiento tengo el siguiente enlace.

consulte el enlace: - http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_HOME

Constante del código clave: tecla de inicio. Esta clave es manejada por el marco y nunca se entrega a las aplicaciones.

Pero, podemos cambiar el botón de retroceso. Espero que el siguiente código te ayude.

@Override public void onBackPressed() { //return nothing return; }


Para cualquiera que desee eliminar completamente el software de navegación en un dispositivo Android rooteado (o ROM personalizado) , puede modificar el archivo de texto build.prop dentro de la carpeta del sistema.

Establezca la siguiente variable / valor:

gemu.hw.mainkeys=1

Esto es lo que los vendedores usan para desactivar el navegador de software, cuando tienen botones físicos.



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 llamas al método onCreate() de tu actividad. Llámalo de nuevo en el método onResume() . Entonces puede agregar otro método en su actividad de esta manera:

@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); hideNavigationBar(); }

Eso será todo. Recuerde que bloqueará la pantalla hasta que la próxima vez que el usuario toque la pantalla, en la clase del temporizador puede cambiar la demora y le permitirá cambiar las cosas para esa instancia. Luego, bloqueará la pantalla nuevamente.


Puede desactivar el botón Inicio y recientemente Android 5.0, usando la función de fijación de pantalla mencionada here :

Android 5.0 introduce una nueva API de fijación de pantalla que le permite restringir temporalmente a los usuarios de dejar su tarea o ser interrumpido por las notificaciones. Esto podría usarse, por ejemplo, si está desarrollando una aplicación educativa para soportar requisitos de evaluación de alto riesgo en Android, o una aplicación de kiosco de propósito único. Una vez que su aplicación active la fijación de pantalla, los usuarios no podrán ver las 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 últimos pueden ser eliminados o deshabilitados dependiendo de cómo active el modo. Escribí información después de probar esta función here .


Puede usar Android-HomeKey-Locker para deshabilitar HOME KEY y otras teclas del sistema (como BACK KEY y MENU KEY)

Espero que esto te ayude en tu aplicación. Gracias.


Refrescando un viejo tema. 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 la actividad en el método onCreate() :

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, necesita obtener permiso de superposición de pantalla del usuario. Probado en Android 7 y 8.


Si apuntas a Android 5.0 y superior. Podrías usar:

Activity.startLockTask()



Solo una suposición, pero creo que con el permiso SYSTEM_ALERT_WINDOW (que se muestra como "Draw over other apps", vea here ) podría ser posible: mostrar su aplicación como una pantalla completa, ventana de tipo de alerta del sistema . De esta forma se ocultará cualquier otra aplicación, incluso la pantalla de inicio, de modo que si presiona Inicio, no se desactivará realmente , simplemente sin ningún efecto visible.

MX Player tiene este permiso declarado, y Facebook Messenger lo tiene también para mostrar " cabezas de chat " sobre cualquier cosa, por lo que podría ser la solución.

Actualización (agregada de mis comentarios): Luego, 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, como dijiste que el gesto de inmersión de salida no funciona, podrías intentar configurar también SYSTEM_UI_FLAG_IMMERSIVE_STICKY (con SYSTEM_UI_FLAG_FULLSCREEN y SYSTEM_UI_FLAG_HIDE_NAVIGATION).


Usar la rotación causa una excepción, así que he corregido 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.


Yo también estaba buscando esto por 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 mantienes pulsado 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í this tutorial con algunas pequeñas modificaciones. Al especificar Type, especifiqué WindowManager.LayoutParams.TYPE_SYSTEM_ERROR lugar de WindowManager.LayoutParams.TYPE_PHONE , de lo contrario, nuestra "superposición" no ocultará las barras del sistema. Puedes jugar con las banderas, la altura, el ancho, etc. para que se comporte como lo desees.


Seguí la respuesta del shaobin0604 y finalmente logré bloquear el botón INICIO, agregando:

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

a AndroidManifest.xml Todo lo que tienes que hacer es copiar HomeKeyLocker.java de la HomeKeyLocker.java 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 .