3

我正在开发一个具有通话功能的应用程序,因此我需要唤醒设备。如果设备被锁定,我使用以下代码将其解锁:

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()

注意第一次调用(在 100 毫秒内取消)和第二次调用(在 4 秒内取消!!!)之间的区别

有任何想法吗?建议?

4

2 回答 2

0

我假设这个代码块在一个活动中,所以我不完全确定你为什么试图通过 keyguard manager 请求它(尽管在检查文档后看起来这是一种正确的方法。)也许试试这个:

致电后,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);
}
于 2021-05-05T12:28:51.807 回答
0

您需要添加以下代码:

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

于 2021-05-11T07:02:20.603 回答