问题描述
我正在开发具有通话功能的应用,因此我需要唤醒设备。如果设备被锁定,我使用下面的代码来解锁它:
keyguardManager.requestdismissKeyguard(this,new KeyguardManager.KeyguarddismissCallback() {
@Override
public void ondismissError() {
super.ondismissError();
AppLog.d(TAG,"Inside ondismissError()");
}
@Override
public void ondismissSucceeded() {
super.ondismissSucceeded();
AppLog.d(TAG,"Inside ondismissSucceeded()");
}
@Override
public void ondismissCancelled() {
super.ondismissCancelled();
AppLog.d(TAG,"Inside ondismissCancelled()");
}
});
在第一次通话中,设备解锁没有任何问题,但在第二次通话中,从调用 requestdismissKeyguard 到调用回调有延迟,所以我的设备在锁屏打开的情况下保持开启状态,导致一个奇怪的状态,因为用户正在等待来电屏幕。
在此处查看我的日志:
2021-04-21 16:25:39.885: Invoking requestdismissKeyguard()
2021-04-21 16:25:39.994: Inside ondismissCancelled()
2021-04-21 16:25:51.835: Invoking requestdismissKeyguard()
2021-04-21 16:25:55.311: Inside ondismissCancelled()
注意第一次调用(100ms 内取消)和第二次调用(4s 内取消!!!)的区别
有什么想法吗?建议?
解决方法
我假设这个代码块在一个活动中,所以我不完全确定你为什么要通过键盘保护管理器请求它(尽管在检查文档后看起来这是一个正确的方法。)也许试试这个:
调用 setContentView
后,您可以调用 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED)
为您的活动暂时移除键盘锁。完成该活动后,键盘锁应返回。
解决方案如下:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
// Dismiss the keyguard temporarily
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(true);
} else {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
}
// Assuming you also want to open the screen and keep it on
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
,
您需要添加此代码:
@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));
}
使用以下方法创建 LockService:
@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();
仅适用于服务。