2014-02-18 22 views
5

Ich möchte die Aktivierung/Deaktivierung der Tastensperre auf dem Gerät zu steuern. Dazu verwende ich DevicePolicyManager und KeyguardLock API von Android SDK.Android - wie Keyguard vollständig zu deaktivieren

Unten ist meine Implementierung, dies zu verwalten:

public class DeviceLocker { 

private static DeviceLocker instance; 

public static synchronized DeviceLocker getInstance(Context context) { 
    if(instance==null) { 
     instance = new DeviceLocker(context); 
    } 
    return instance; 
} 

private Context context; 
private KeyguardLock lock; 

private DeviceLocker(Context context) { 
    this.context = context; 
} 

public void lock() { 
    lock(true); 
} 

public void lock(boolean lockNow) { 
    getLock().reenableKeyguard(); 
    DevicePolicyManager devicePolicyManager = getDevicePolicyManager(); 
    if(devicePolicyManager==null) { 
     return; 
    } 
    LocalStorage storage = LocalStorage.from(context); 

    boolean result = devicePolicyManager.resetPassword(storage.getPassword(), 
      DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY); 

    if(lockNow) { 
     devicePolicyManager.lockNow(); 
    } 
    storage.setDeviceLocked(true); 
} 

public void unlock() { 
    DevicePolicyManager devicePolicyManager = getDevicePolicyManager(); 
    if(devicePolicyManager==null) { 
     return; 
    } 
    devicePolicyManager.resetPassword("",0); 
    getLock().disableKeyguard(); 
    LocalStorage.from(context).setDeviceLocked(false); 
} 

private KeyguardLock getLock() { 
    if(lock==null){ 
     KeyguardManager kgManager = (KeyguardManager)context.getSystemService(Activity.KEYGUARD_SERVICE); 
     lock = kgManager.newKeyguardLock(Context.KEYGUARD_SERVICE); 
    } 
    return lock; 
} 

private DevicePolicyManager getDevicePolicyManager() { 
    DevicePolicyManager devicePolicyManager = 
     (DevicePolicyManager)context.getSystemService(Context.DEVICE_POLICY_SERVICE); 
    ComponentName deviceAdmin = new ComponentName(context, WatchGuardDeviceAdminReceiver.class); 
    LocalStorage storage = LocalStorage.from(context); 
    if(!devicePolicyManager.isAdminActive(deviceAdmin)) { 
     return null; 
    } 
    if(!storage.isPasswordSet()) { 
     UIUtils.showMessage(context, R.string.password_not_set); 
     return null; 
    } 
    devicePolicyManager.setPasswordQuality(deviceAdmin,DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED); 

    return devicePolicyManager; 
} 

}

Es funktioniert ok in Bezug auf die Verriegelung des Bildschirms, aber entsperren fucntionality mit einigen Problemen funktioniert: manchmal funktioniert es, wie ich will (Entfernt jede Art von Tastenschutzbildschirm vollständig), aber manchmal wird der Bildschirm "Entsperren mit Folie" angezeigt.

Wissen Sie, was ist das Problem hier? Wie funktioniert es stabil (zumindest in allen Fällen entweder "Entsperren auf Folie" oder vollständige Entfernung der Tastensperre)?

Vielen Dank im Voraus für Hilfe.

EDIT

Ich will nur, dass meine Lösung funktioniert, darauf hinzuweisen, aber das Problem ist, dass es (manchmal entfernt Tastensperre vollständig und manchmal zeigen „slide“ Tastensperre) instabil arbeitet. Und ich benutze es nicht nur, um die Tastensperre zu deaktivieren, während einige Aktivität zu zeigen, sondern um Sperren/Entsperren des Geräts gemeinsam, so dass ich diesen Code im Service verwenden, kann ich nicht getWindow().addFlags(..) aufrufen, weil ich nicht das Fenster zu haben sich bewerben.

Ich frage mich nur, ob jemand mit diesem instabilen Verhalten zu tun hatte.

+0

Was ist die LocalStorage-Klasse hier? Machst du das von einem Web-Framework irgendeiner Art? Hattest du jemals eine funktionierende Lösung? Ich möchte dies in einem DPC implementieren. – Keilaron

Antwort

1
KeyguardManager keyguardManager = (KeyguardManager)getSystemService(Activity.KEYGUARD_SERVICE); 
KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE); 
lock.disableKeyguard(); 

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

or 

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
4

AFAIK es nicht überall möglich ist, andernfalls eine große Sicherheitslücke wäre.

Auf einem nicht gerooteten Telefon können Sie die nicht sichere Tastensperre einfach schließen oder Ihre App über der sicheren Tastensperre anzeigen.

Hier ist eine Combo, dies zu tun:

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

Auf einem verwurzelten Telefon Sie sicher Tastensperre zu entfernen versuchen, kann (auch wenn Sie das Gerät neu starten kann, bevor es weg eigentlich geht).

Hier ist eine Combo für das (habe es selbst nicht ausprobiert, aber ich bin mir ziemlich sicher, dass einige Apps im Play Store „Ihr Telefon entsperren“ verwenden diesen Trick)

Runtime.getRuntime().exec("sudo rm /data/system/gesture.key"); 

Ich empfehle Ihnen, versuchen diese über adb zuerst.Auch hier ist ein XDA Thread mit weiteren Informationen zu diesem Thema: http://forum.xda-developers.com/showthread.php?t=1800799

+0

Es wäre nur eine Verletzung in einem Standard-App-Szenario. Wenn jemand mit dem DPM zu tun hat, sind sie zumindest eine Geräte-Admin-App - möglicherweise immer noch in diesem Fall, aber IMO eine Geräte-Besitzer-App sollte nicht nur, sondern * muss * diese Funktionalität haben. – Keilaron

3

Sie müssen diesen Code hinzuzufügen:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|WindowManager.LayoutParams.FLAG_FULLSCREEN| 
       WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.lockscreen); 

     startService(new Intent(this,LockService.class).setAction(Intent.ACTION_SCREEN_OFF)); 
    } 

erstellen LockService mit:

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 

     if(intent == null || intent.getAction() == null) 
      return START_NOT_STICKY; 

     String action = intent.getAction(); 

     if(action.equals(ACTION_SCREEN_OFF)) 
     { 
      KeyguardManager.KeyguardLock k1; 
      KeyguardManager km =(KeyguardManager)getSystemService(KEYGUARD_SERVICE); 
      k1= km.newKeyguardLock("IN"); 
      k1.disableKeyguard(); 
     } 

     return START_NOT_STICKY; 
    } 

Eigentlich weiß ich nicht, warum , aber k1.disableKeyguard(); funktioniert nur im Service.

+0

hey, thnaks für das Angebot, aber ich benutze es bereits im Service und es funktioniert. es funktioniert nur instabil (komplett keine Tastensperre oder "slide" Tastensperre) und ich frage mich, ob jemand mit dieser Art von Verhalten beschäftigt ist. – kowalski

+0

Sie müssen nur entsperren, oder? Siehe Code oben (onCreate methond). Sie können eine neue Aktivität erstellen, zum Beispiel "DismissLockActivity", und wenn Sie die Tastensperre schließen müssen, starten Sie einfach die Aktivität und beenden Sie sie. Ich habe jetzt diesen hässlichen Hack, aber in meiner App funktioniert das perfekt. – dooplaye