Android 支持指纹的锁屏

Android Lockscreen with FingerPrint support

我有一个用作自定义锁屏的应用程序,我想保留使用指纹的解锁功能。我想在设备屏幕关闭或查看锁屏时解锁我的 phone。锁屏是一个 activity,运行 高于所有其他组件。如果设备空闲(屏幕关闭)并且我使用指纹,phone 打开但我的锁屏仍然可见。如果我在显示锁屏时使用指纹,则没有任何反应,传感器未激活。如果我自己用 FingerprintManager 监听指纹,我可以监听成功的指纹使用,但如果我关闭我的 activity,锁屏仍然打开。

我一直在关注 Microsoft 的 Next,他们以某种方式实现了这一目标。我的猜测是他们没有 运行 Activity 作为他们的锁屏,但他们只是将他们的视图绘制到 WindowManager 中并以某种方式监听锁屏解锁,然后他们隐藏他们的 UI。这种方法的问题(我认为至少)是,如果没有 Activity,我无法为沉浸模式设置 Window 标志,并且我无法绘制 status/navigation 栏。

我终于解决了。关键是不要自己听指纹,而是让系统处理它。我的锁屏是像这样添加到 WindowManager 的视图

val params = WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION or
                            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or
                            WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or
                            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
                            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
                            WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
                    , PixelFormat.TRANSLUCENT)

manager.addView(lockscreenView, params)

并在 onViewAttached 中设置锁屏视图 UI 可见性标志

override fun onAttachedToWindow() {
    super.onAttachedToWindow()
    systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
 }

然后您必须提供自己的自定义解锁机制,以便用户可以关闭您的锁屏并另外收听 Intent.ACTION_USER_PRESENT 指示锁屏已解锁的广播(例如使用指纹)