À 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 unService
qui gère deux choses, la tenue d'une statiqueKeyguardManager
et les objets liés, et d'organiser uneBroadcastReceiver
pour recevoirIntent.ACTION_SCREEN_ON
etIntent.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
etACTION_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.
- Après je désactiver
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.
Vous devez vous connecter pour publier un commentaire.
J'ai utilisé ce avec un certain succès dans les deux Gingerbread et ICS pour ouvrir mon activité (par l'intermédiaire d'un service d'arrière-plan qui est en elle). Dans l'activité en cours de démarrage:
J'ai eu le même problème pour le clic du bouton d'ACCUEIL lors du déverrouillage de l'appareil. Ce problème peut être résolu par la mettre à zéro le mot de passe vide (c'est à dire "") :
et de désactivation du keygaurd :
Espère que cela a résolu votre problème. \m/garder le codage!
J'ai essayé de faire cela, mais mon activité toujours précédée par le système de verrouillage de l'écran. isOrderdBroadcast() dit que ACTION_SCREEN_NO est d'un ordre de diffusion.
J'ai ajouté drapeau de l'activité :
dans onAttachedView(). Mais malgré cela, le système de verrouillage est d'obtenir la préférence sur mon Custom de verrouillage de l'écran de l'activité.
Comment avez-vous obtenu votre activité avant que le système de verrouillage de l'écran?
MODIFIER
Sur un peu de recul, je pense que ma compréhension de l'écran de verrouillage était erroné. Mon récepteur de radiodiffusion a été d'obtenir la diffusion en premier. Mais ce qui a été montrant avant que le système de verrouillage de l'écran de lancement lors de la SCREEN_OFF est reçu. Résolu le problème dès maintenant.
Mais perplexe par l'ambiguïté de la maison le comportement de la touche. Ce ne sera pas un problème dans le post ICS appareils que tous les boutons sont découragés.
Dans votre LockScreenActivity, se terminant le code de validation par
finish();
tue le LockscreenActivity et donc l'ensemble de l'application. Au lieu de cela, vous pouvez simplement le lancement de votre activité principale (ou autre) comme ceci :Si PSBA est dans votre contrôle, vous devez définir la simple drapeau et clavier (le) est parti pour de bon.
Voici les détails pour le faire, obtenir dans le fichier
"overlay/frameworks/base/packages/SystemUI/res/values/config.xml"
et de la recherche pour "config_enableKeyguardService", puis définissez l'indicateur de faux.
PAS PLUS le clavier, pheww