DUPLICATE警告:此问题涉及Android API的详细信息,适用于从某些前端和服务调用,SO上有许多类似的线程,但只关注前端。
我想以编程方式启用键盘锁,因此例如用户点击我的应用中的按钮并且手机被锁定(使用手机用户必须先解锁)。
问题是 - 我希望找到坚如磐石的方式,适用于每一个有效的案例。
我试过了:
lockNow
DevicePolicyManager
- 当屏幕关闭(但电话未锁定)时,此调用将被忽略(即键盘锁未激活)
reenableKeyguard
KeyguardManager.KeyguardLock
- 在每种情况下都会忽略对该方法的调用
goToSleep
与PowerManager
- 我无法调用它,因为许可问题,它需要DEVICE_POWER
尽管我已经拥有此权限集
到目前为止,我采用第一种方式(lockNow
)进行额外的黑客操作,以某种方式处理屏幕关闭时的情况,但它非常难看,因此我希望有一些直截了当的方式。
答案 0 :(得分:1)
一种解决方案是在postdelayed处理程序上使用线程。 这里的问题是,即使屏幕关闭,线程也会保持活动状态,你的应用程序将处于暂停状态(除非进程被杀死)
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
keyLock.reenableKeyguard();
Log.i("LOCK","key guard back on");
finish();
}
}, 300);
另一种方法是使用计时器任务,但计时器任务有时可能会被杀死(不确定,但我过去的经验说不确定)
TimerTask Active = new TimerTask() {
@Override
public void run() {
keyLock.reenableKeyguard();
Log.i("LOCK","key guard back on");
finish();
}
};
Timer starter = new Timer();
starter.schedule(Active, 300);
我无法100%确定这是您正在寻找的“坚如磐石的方式”,但我一直与设备政策经理以及键盘管理员一起工作了一段时间,我遇到了类似的问题, locknow()方法将关闭屏幕,然后返回上面的Android 4.0设备。
我在查看DDMS调试日志时遇到了这个解决方案,并希望在某些设备上进行测试。到目前为止,它并没有让我失望,所以无论如何这里都是一个提示。