Android Lockscreen with FingerPrint support

China☆狼群 提交于 2019-12-22 10:00:39

问题


I have an app that serves as custom lockscreen and I want to preserve unlock functionality using fingerprint. I want to unlock my phone when device screen is off or when I am looking at my lockscreen. The lockscreen is an activity that runs above all other components. If device is idle (screen is off) and I use fingerprint, phone turns on but my lockscreen is still visible. If I use fingerprint when my lockscreen is shown, nothing happens, the sensor is not active. If I implement listening for fingerprint with FingerprintManager by myself I am able to listen for successful fingerprint use, but if I dismiss my activity the lockscreen is still turned on.

I`ve been looking at Next by Microsoft and they somehow achieved that. My guess is that they do not run Activity as their lockscreen but they just draw their view into WindowManager and somehow listens for lockscreen unlock and then they hides their UI. Problem with this approach (I think at least) is that without Activity I cannot set Window flags for immersive mode and I cannot draw over status/navigation bar.


回答1:


I`ve finally solved it. The key is to not listen for fingerprint myself but just let system handle it. My lockscreen is view that is added to WindowManager like this

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)

and lockscreen view in onViewAttached sets UI visibility flags

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

Then you have to provide your own custom unlock mechanism so user can dismiss your lockscreen and additionaly listen for Intent.ACTION_USER_PRESENT broadcast that indicates that lockscreen is unlocked (for example with fingerprint)



来源:https://stackoverflow.com/questions/42155059/android-lockscreen-with-fingerprint-support

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!