El Contexto

Recientemente, he estado buscando una manera confiable de control de garantías Android Teclado. Principalmente para mostrar personalizados en la pantalla de bloqueo. Sé que Google había declarado personalizado bloqueo de pantallas no están oficialmente soportados por la plataforma, y debemos esperar que las cosas se rompen, sin embargo, con las Api existentes, creo que debe haber maneras de hacer esto. He hecho toneladas de la investigación por alrededor de una semana, pero todavía tiene un problema de aquí y de allá. Lo he implementado, suponiendo un seguro de Bloqueo de teclado está activado, por lo que ahora son,

  • Administrador de ventanas.LayoutParams.FLAG_SHOW_WHEN_LOCKED permite una actividad(una ventana) para que se muestre en pantalla, poner el Teclado detrás, y todas las acciones inseguras son prevenidos. Panel de notificación está deshabilitado, terminando la actividad, aparecerá el Teclado. He implementado de la siguiente en mi pantalla de bloqueo de la actividad.

    @Override
    public void onAttachedToWindow() {
        window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    }
  • KeyguardManager, KeyguardManager.KeyguardLock están en desuso clases, pero el trabajo sigue todo el camino a Jelly Bean. Para hacer esto, tengo un Service que maneja dos cosas, la celebración de una estática KeyguardManager y los objetos relacionados, y tienen que mantener un BroadcastReceiver para recibir Intent.ACTION_SCREEN_ON y Intent.ACTION_SCREEN_OFF. (todos los objetos se inicializan correctamente)


Para ScreenReceiver

public static synchronized void disableKeyguard() {
    if ( isLocked ) {
        if ( keyguardLock == null ) {
            keyguardLock = keyguardManager.newKeyguardLock(LOG_TAG);
        }
        keyguardLock.disableKeyguard();
        isLocked = false;
    }
}

public static synchronized void reenableKeyguard() {
    if ( !isLocked ) {
        if ( keyguardLock == null ) {
            keyguardLock = keyguardManager.newKeyguardLock(LOG_TAG);
        }
        keyguardLock.reenableKeyguard();
        keyguardLock = null;
        isLocked = true;
        }
}

Para BroadcastReceiver

@Override
public void onReceive( Context context, Intent intent ) {
    if ( intent.getAction().equals(Intent.ACTION_SCREEN_ON) ) {
        Intent start = new Intent(context, LockScreen.class);
        start.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        context.startActivity(start);
    } else if ( intent.getAction().equals(Intent.ACTION_SCREEN_OFF) ) {
        ScreenReceiverService.reenableKeyguard();
    }
}

Para LockScreenActivity, cuando el usuario ingrese el código de acceso correcto,

window.clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
ScreenReceiverService.disableKeyguard();
finish();

El Problema

  • Cosas que funciona

    • ACTION_ON y ACTION_OFF se reciben de forma fiable.
    • LockScreenActivity se muestra antes de que el Bloqueo de teclas (sin teléfono estado de la manipulación aún)
    • Notificación no puede ser derribado, salir de la actividad de alguna forma mostrar el lockscreen.
  • Cosas que no funcionan

    • Después de deshabilitar Keyguard y llame a finish(), mi aplicación y salidas de pantalla de inicio o la última actividad antes de que la pantalla se apagó se muestra. Sin embargo, cada vez que pulse la Tecla de Inicio, el Bloqueo del teclado parpadeará en la pantalla, descartando rápidamente inmediatamente, y la normal de la tecla de Inicio Tecla de función/evento no se controla (no volverá a la pantalla de inicio después de parpadear). Esto se observa cuando yo rápidamente aprovechado la Casa varias veces la Tecla.

Incluso he mirado en el código fuente de Android para encontrar la Casa de manejo de la Tecla, pero nunca se envía a las aplicaciones de terceros, a menos que el tipo de ventana es WindowManager.LayoutParams.TYPE_KEYGUARD o WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG, que lanzará SecurityException en 4.0+ incluso se trabajó en plataformas anteriores. Y para el Keyguard, he declarado DISABLE_KEYGUARD permiso de uso, esto no debería ser el problema. Mi conjetura es la bandera FLAG_SHOW_WHEN_LOCKED dirá el sistema para manejar a Keyguard en algunas de las maneras en que podría entrar en conflicto con otros desactivar las llamadas. Dado que este indicador es utilizado principalmente para la Alarma de SMS/tipo de aplicación, que es para mostrar información limitada para el usuario, luego de despedir a sí mismos y llevar hasta el Keyguard. Pero en mi caso, después de que el usuario desbloquear mi pantalla de bloqueo, a continuación, desbloquear el sistema lockscreen simplemente derrotas el propósito de mi aplicación.

Así que la pregunta es ¿por qué el Keyguard parpadea cuando me de prensa de la Casa después de que te desactivado? ¿Hay alguna solución alternativa para este problema?

P. S. Gracias por la lectura de un largo tiempo de que se trate. Esta es mi primera vez haciendo una pregunta aquí, si hay algo que hice mal, dime por favor (es decir, el formato, la gramática, el código de la convención, etiquetas, etc.). También he tenido ninguna experiencia con conocimientos de programación, empecé con Android antes de que yo sé lo que Java es. Así que no he tomado ningún curso de formación/sin embargo, esta comunidad es impresionante y, a menudo ayudar a la gente como yo, incluso si son simples preguntas, y por supuesto mirando Google I/O vídeos, leer blogs, leer a los demás’ código me ayudan mucho. Así que por favor tolerar cualquier tonto errores/errores obvios/preguntas estúpidas. Yo soy de sólo 16 años. ^_^»

  • ¿Alguna vez encontrar una solución a este problema? Tengo el mismo problema de que el teclado viene cuando yo pulse home. Se ve como una característica de seguridad, y me estoy quedando sin esperanza de que esto se puede hacer sin ningún tipo de hacks.
InformationsquelleAutor Edmond C | 2012-08-06

5 Comentarios

  1. 15

    He utilizado con éxito tanto en Gingerbread y ICS para abrir mi actividad (a través de un servicio en segundo plano que es el inicio de la misma). En la actividad se inicia:

    @Override
    public void onAttachedToWindow() {
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | 
                WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
                WindowManager.LayoutParams.FLAG_FULLSCREEN | 
                WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    }
    • sólo uso addFlags(int flags), que hace lo mismo. Pero esta solución no funciona en android L ya, porque FLAG_DISMISS_KEYGUARD y FLAG_SHOW_WHEN_LOCKED juntos parece que no funciona (lo cual es un error y que ya se ha informado).
    • por cierto, que el informe de error (con una posible solución) está aquí: code.google.com/p/android-developer-preview/issues/…
    • Parece estar trabajando en un Moto X 2014 con Android 5.1, tal vez lo tengo solucionado?
    • genial, funciona para mí!
  2. 1

    Tuve el mismo problema para el clic del botón de INICIO, mientras que desbloquear el dispositivo. Esto puede ser solucionado por el restablecimiento de la contraseña en blanco (es decir,»») :

    DevicePolicyManager devicePolicyManager;
    ComponentName demoDeviceAdmin;
    
    
    devicePolicyManager.setPasswordQuality(demoDeviceAdmin,DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
    devicePolicyManager.setPasswordMinimumLength(demoDeviceAdmin, 0);
    
    devicePolicyManager.resetPassword("",DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY);

    y, a continuación, deshabilitar el keygaurd :

    this.keyGuardLock = ((KeyguardManager)getSystemService("keyguard")).newKeyguardLock("keyguard");
    keyGuardLock.disableKeyguard();

    Espero que este solucionado el problema. \m/mantener codificar!

  3. 0

    Administrador de ventanas.LayoutParams.FLAG_SHOW_WHEN_LOCKED permite una actividad(un
    de la ventana) para que se muestre en pantalla, poner el Teclado detrás de

    Traté de hacer esto, pero mi actividad siempre precedido por el sistema de la pantalla de bloqueo. isOrderdBroadcast() dice que ACTION_SCREEN_NO es una orden de emisión.

    He añadido un indicador de la actividad :

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);

    en onAttachedView(). Pero todavía el sistema de bloqueo es conseguir la preferencia sobre mi Costumbre de bloqueo de pantalla de la actividad.

    ¿Cómo consiguió su actividad antes de que el sistema de la pantalla de bloqueo?

    EDITAR
    En una mirada retrospectiva, creo que mi entendimiento de la pantalla de bloqueo concepto era erróneo. Mi broadcast receiver fue la primera emisión. Pero lo que estaba mostrando antes de que era el sistema de la pantalla de bloqueo inició cuando SCREEN_OFF es recibido. Solucionado ese problema como el de ahora.

    Pero perplejo por la ambigüedad de la casa comportamiento del botón. Esto no será un problema en el post de ICS dispositivos como todos los botones duros son desalentados.

    • Usted no puede específicas de este indicador durante SCREEN_OFF de difusión, debido a que este es el momento en que el sistema prepara el Bloqueo de teclas para el próximo SCREEN_ON. Por lo tanto, como se dijo, esto no tendría ningún efecto sobre el Teclado. Si usted simplemente quiere que su actividad que se muestra antes de la pantalla de bloqueo, pero no sustituir, el getWindow() el método es el camino. Personalizada de la pantalla de bloqueo no está soportado por el sistema como dije en mi post original, por lo que tendrá que encontrar otras maneras de hacerlo. Recuerde que para publicar una nueva pregunta si esto no es una respuesta a mi pregunta. X)
  4. 0

    En su LockScreenActivity, terminando el código de validación por finish(); mata el LockscreenActivity y por lo tanto toda la aplicación. En lugar de eso, se podría lanzar de nuevo su actividad principal (o cualquier otro) como este :

    startActivity(new Intent(LockScreenActivity.this, MainActivity.class));
  5. 0

    Si AOSP está en su control, entonces usted necesita para establecer el simple bandera y el bloqueo de teclas() se ha ido para siempre.
    Aquí los detalles para hacer que, de conseguir en el archivo
    «overlay/frameworks/base/packages/SystemUI/res/values/config.xml»
    y la búsqueda para «config_enableKeyguardService», a continuación, establezca el indicador a false.

    NO MÁS bloqueo, pheww

Dejar respuesta

Please enter your comment!
Please enter your name here