调用 requestDismissKeyguard() 两次,结果延迟

问题描述

我正在开发具有通话功能的应用,因此我需要唤醒设备。如果设备被锁定,我使用下面的代码来解锁它:

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(); 仅适用于服务。