デバイスでキーガードの有効化/無効化を制御したい。そのために、Android SDK の DevicePolicyManager と KeyguardLock API を使用しています。
以下は、これを管理するための私の実装です。
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;
}
}
画面のロックに関しては問題なく動作しますが、ロック解除機能にはいくつかの問題があります。希望どおりに動作する場合があります(あらゆるタイプのキーガード画面を完全に削除します)が、「スライドでロック解除」キーガード画面が表示される場合があります。
ここで何が問題なのか知っていますか?安定して動作させる方法は?
よろしくお願いします。
編集
私のソリューションが機能することを指摘したいだけですが、問題は動作が不安定なことです(キーガードが完全に削除されることもあれば、「スライド」キーガードが表示されることもあります)。また、いくつかのアクティビティを表示しているときにキーガードを無効にするだけでなく、デバイスのロック/ロック解除を共通に制御するためにも使用するため、このコードをサービスで使用するためgetWindow().addFlags(..)
、ウィンドウがないため呼び出すことができません申し込み。
誰かがこの不安定な動作に対処したのではないかと思っています。