Android 安卓-如何完全禁用键盘保护
我想控制设备上的键盘防护的启用/禁用。 为此,我使用了Android SDK的DevicePolicyManager和KeyguardLockAPI 以下是我管理此问题的实施:Android 安卓-如何完全禁用键盘保护,android,keyguard,device-policy-manager,Android,Keyguard,Device Policy Manager,我想控制设备上的键盘防护的启用/禁用。 为此,我使用了Android SDK的DevicePolicyManager和KeyguardLockAPI 以下是我管理此问题的实施: public class DeviceLocker { private static DeviceLocker instance; public static synchronized DeviceLocker getInstance(Context context) { if(instance==null)
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(…)
因为我没有要应用的窗口
我只是想知道是否有人处理过这种不稳定的行为。KeyguardManager KeyguardManager=(KeyguardManager)getSystemService(Activity.KEYGUARD\u SERVICE);
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);
KeyguardLock=keyguardManager.newKeyguardLock(KEYGUARD\u服务);
lock.disableKeyguard();
或
getWindow().addFlags(WindowManager.LayoutParams.FLAG\u discouse\u KEYGUARD);
如果您有一个窗口需要在唤醒时越过锁屏顶部,我建议您使用窗口标志“关闭”键盘或“锁定时显示” 使用方法如下(在设置布局之前在onCreate中调用)
好吧,这不是普遍可能的,否则,这将是一个重大的安全漏洞 在非根型手机上,您最多只能关闭非安全键盘或在安全键盘上方显示您的应用程序 这里有一个组合来执行此操作:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
在有根的手机上,您可以尝试移除安全键盘(尽管您可能需要在设备真正离开之前重新启动设备)
这里有一个组合(我自己还没有尝试过,但我很确定Play Store中的几个“解锁手机”应用程序都使用了这个技巧)
我建议你先通过adb试试这个。此外,这里还有一个XDA线程,其中包含有关此的更多信息:您需要添加以下代码:
@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));
}
使用以下内容创建锁定服务:
@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;
}
实际上,我不知道为什么,但是
k1.disableKeyguard()代码>仅在服务中有效。嘿,感谢您的报价,但我已经在服务中使用了它,而且它有效。它只是工作不稳定(完全没有键盘保护或“滑动”键盘保护),我想知道可能有人处理过这种行为。你只需要解锁,对吗?请参阅上面的代码(onCreate方法)。您可以创建新活动,例如DismissLockActivity,当您需要解除keyguard时,只需启动活动并完成。我现在知道这是一个丑陋的黑客,但在我的应用程序中,这是完美的。这只会是一个标准应用程序场景中的漏洞。如果有人正在处理DPM,他们至少是一个设备管理员应用程序——在这种情况下可能仍然是这样,但在我看来,设备所有者应用程序不仅应该而且必须具有此功能。这里的LocalStorage类是什么?您是从某种Web框架中执行此操作的吗?还有,你有没有找到有效的解决方案?我希望在DPC中实现这一点。
@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));
}
@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;
}