À l'aide de FLAG_SHOW_WHEN_LOCKED avec disableKeyguard() et gardé l'écran de verrouillage Android

Le Contexte

Récemment, j'ai été à la recherche de moyens fiables de contrôle sécurisé Android Clavier. Principalement pour l'affichage personnalisé de l'écran de verrouillage. Je sais que Google avait déclaré personnalisé des écrans de verrouillage ne sont pas officiellement pris en charge par la plate-forme et doit attendre que les choses rupture, cependant, avec l'Api, je crois qu'il doit y avoir des moyens pour ce faire. J'ai fait des tonnes de recherches pour environ une semaine, mais encore avoir des problèmes ici et là. Ce que j'ai mis en œuvre, en supposant que d'une facilité de Verrouillage du clavier est activé, jusqu'à présent sont,

  • WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED permet une activité(une fenêtre) pour être affichées sur l'écran, le fait de placer le Clavier derrière, et tous les comportements non sécuritaires sont empêchés. Panneau de Notification est désactivé, la finition de l'activité fera apparaître le Clavier. J'ai mis en place comme suite à mon écran de verrouillage de l'activité.

    @Override
    public void onAttachedToWindow() {
        window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    }
  • KeyguardManager, KeyguardManager.KeyguardLock sont obsolètes classes, mais ils continuent de travailler tout le chemin vers Jelly Bean. Pour ce faire, j'ai un Service qui gère deux choses, la tenue d'une statique KeyguardManager et les objets liés, et d'organiser une BroadcastReceiver pour recevoir Intent.ACTION_SCREEN_ON et Intent.ACTION_SCREEN_OFF. (tous les objets sont initialisés correctement)


Pour 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;
        }
}

Pour 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();
    }
}

Pour LockScreenActivity, quand l'utilisateur a saisi le bon mot de passe,

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

Le Problème

  • Choses qui fonctionne

    • ACTION_ON et ACTION_OFF sont reçus de manière fiable.
    • LockScreenActivity est indiqué avant le Verrouillage du clavier (sans téléphone état de manutention encore)
    • La Notification ne peut pas être tiré vers le bas, la sortie de l'activité en aucune façon serait d'afficher le lockscreen.
  • Des choses qui ne fonctionne pas

    • Après je désactiver Keyguard et appel finish(), mon appli des sorties et de l'écran d'accueil ou la dernière activité avant de l'écran est off est indiqué. Cependant, chaque fois que j'appuie sur la Touche d'Accueil enfoncée, le Clavier clignote dans l'écran, rapidement rejetant lui-même immédiatement, et la normale à la Maison Clé de fonction/de l'événement n'est pas géré (ne pas retourner à l'écran d'accueil après le flashage). C'est observée lorsque j'ai rapidement à la Maison plusieurs fois sur la Touche.

J'ai même regardé dans le code source Android pour trouver la Clé de base de la manipulation, mais il n'est jamais envoyé aux applications de tiers, à moins que le type de fenêtre est WindowManager.LayoutParams.TYPE_KEYGUARD ou WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG, qui lancera SecurityException sur 4.0+ même il a travaillé sur des plates-formes antérieures. Et pour le Keyguard, je l'ai déclaré à DISABLE_KEYGUARD l'autorisation d'utiliser cela ne devrait pas être le problème. Ma conjecture est que le drapeau FLAG_SHOW_WHEN_LOCKED va dire le système de poignée à Keyguard dans certains des moyens qui seraient en conflit avec d'autres désactiver les appels. Depuis cet indicateur est principalement utilisée pour l'Alarme/SMS type de demande, qui est de montrer limitée de l'information à l'utilisateur, puis rejeter eux-mêmes et de rapprocher les Keyguard. Mais dans mon cas, ayant à l'utilisateur de déverrouiller mon écran de verrouillage déverrouiller le système lockscreen simplement défait le but de mon application.

Donc, la question est de savoir pourquoi le Keyguard clignote à chaque fois que je presse à la Maison après j'ai désactivé? Est-il une solution/contournement pour ce problème?

P. S. je vous Remercie pour la lecture de cette longue question. C'est ma première fois de poser une question ici, si il y a quelque chose que j'ai fait de mal, s'il vous plaît dites-moi (c'est à dire le format, la grammaire, le code de la convention, les étiquettes, etc.). Aussi, je n'avais aucune expérience avec aucune connaissance en programmation, j'ai commencé avec Android avant que je sais que Java est. Donc je n'ai pas pris un bon cours de formation/pourtant, cette communauté est génial et souvent aider les gens comme je l'ai même si elles sont de simples questions, et bien sûr regarder la Google I/O, les vidéos, les blogs de lecture, lire le code d'autres m'aident beaucoup. Merci donc de tolérer toute stupides erreurs/évident bugs/questions stupides. Je suis seulement 16. ^_^"

  • Avez-vous jamais trouver une solution à ce problème? J'ai le même problème lorsque le verrouillage du clavier revient lorsque je presse la maison. Il ressemble à une fonction de sécurité, et je suis à cours d'espoir que cela peut être fait sans aucun hacks.
InformationsquelleAutor Edmond C | 2012-08-06