如何在我自己的私有应用程序中使用Android的Face Unlock?

时间:2013-09-19 06:52:20

标签: android security android-support-library password-protection face-recognition

我想使用Face Unlock作为我的应用的第二个因素,因为我的大多数用户都不会使用密码锁定手机。

是否有Android API可以在Android应用中集成Face Unlock?

有用于照片识别的人脸检测API,但我找不到可用于离线场景的API,特别是应用程序中的其他因素。

如果你需要一个真实世界的例子,假设这是一个密码管理器,或者电话将借给孩子......并且所有者永远不会锁定电话。面部解锁将确保他们需要私密的东西。

2 个答案:

答案 0 :(得分:10)

  

对于那些不喜欢阅读的人: OpenCV可以完成面部识别方面的所有目标。 (文件here

这是一个难以回答的问题,因为现有的Android应用程序很少使用您要求的面部识别技术。但是,您可能需要检查这些网站:

A good list of face detection software

A decent walkthrough for some of the main api's available

Another higher quality tutorial...

Documentation for default android FaceDetector class

It might be useful to take a look at this sample which uses the OpenCV library

我理解无法离线完成此操作的问题。为了解决这个问题,您可以随时添加“备份”,例如正常密码,只有在发现用户无法访问互联网后才会生效。另一个解决方案是只需要一个稳定的互联网/蜂窝连接,让您的应用程序正常运行。

编辑:不幸的是,

  

面部解锁是闭源google专有代码,因此我们没有机会对其进行修改。   资料来源:http://forum.xda-developers.com/showthread.php?t=1367610

您可能正在寻找以下信息:

最受欢迎的图像处理库等似乎是OpenCV,它有一个可以找到的Java包装器here

您还需要在后台运行此功能,定期检查用户的脸部,而不会显示正在进行此操作,因此在选择库/方法时应牢记这一点

  

来源:前段时间,我实施了面部识别技术,作为用户登录我的某个应用程序的一种方式,所以我只是在回顾我在寻找同一问题答案时的记忆

你的情景:

  

如果你需要一个真实世界的例子,假设这是一个密码管理器,或者电话将借给孩子......并且所有者永远不会锁定电话。面部解锁将确保他们需要私密的东西。

至于完成这个,我会读到安卓加密,如果你的意思是“保护他们需要私密的东西”。否则,如果您只是想使用面部识别而不是密码创建各种“应用程序锁定”,这可以更简单,并且可以使用意图/基本if语句等来完成(我假设您完成了爪哇)

  

请随时提问。目前我正在寻找我的旧源代码,我做了类似于你想要的东西,但我怀疑我还有它...

更新:检查this ...是的,OpenCV可以脱机使用,所以我认为这是你们正在寻找的

答案 1 :(得分:1)

现在,您可以使用Biometric API,该API在后台检查设备上可用的生物识别类型(面部解锁或指纹识别),并且可以完成所有工作,包括处理许多特定于硬件的问题。

因此,首先添加依赖项:

implementation 'androidx.biometric:biometric:1.0.1'

您可以通过以下方法检查可用性:

val biometricManager = BiometricManager.from(this)
when (biometricManager.canAuthenticate()) {
    BiometricManager.BIOMETRIC_SUCCESS ->
       // App can authenticate using biometrics
    BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE ->
       // No biometric features available on this device
    BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE ->
       // Biometric features are currently unavailable
    BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED ->
       // The user hasn't associated any biometric credentials with their account
}

使用为您提供的系统对话框:

private lateinit var executor: Executor
private lateinit var biometricPrompt: BiometricPrompt
private lateinit var promptInfo: BiometricPrompt.PromptInfo

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_login)
    executor = ContextCompat.getMainExecutor(this)
    biometricPrompt = BiometricPrompt(this, executor,
            object : BiometricPrompt.AuthenticationCallback() {
        override fun onAuthenticationError(errorCode: Int,
                errString: CharSequence) {
            super.onAuthenticationError(errorCode, errString)
            // Authentication error
        }

        override fun onAuthenticationSucceeded(
                result: BiometricPrompt.AuthenticationResult) {
            super.onAuthenticationSucceeded(result)
            // Authentication succeeded!
        }

        override fun onAuthenticationFailed() {
            super.onAuthenticationFailed()
            // Authentication failed
        }
    })

    promptInfo = BiometricPrompt.PromptInfo.Builder()
            .setTitle("Biometric login for my app")
            .setSubtitle("Log in using your biometric credential")
            .setNegativeButtonText("Use account password")
            .build()

    // Prompt appears when user clicks "Log in".
    // Consider integrating with the keystore to unlock cryptographic operations,
    // if needed by your app.
    biometricLoginButton.setOnClickListener {
        biometricPrompt.authenticate(promptInfo)
    }
}

如果您希望您的应用程序解锁,请在面部解锁(例如,用户进行购买时)后按确认-这是默认行为。 如果您想不经确认就立即解锁应用程序:

//允许用户在接受其生物特征凭证后不执行任何操作(例如按按钮)进行身份验证。

promptInfo = BiometricPrompt.PromptInfo.Builder()
        .setTitle("Biometric login for my app")
        .setSubtitle("Log in using your biometric credential")
        .setNegativeButtonText("Use account password")
        .setConfirmationRequired(false)
        .build()

enter image description here

此外,您可能需要设置后备状态,以便用户使用设备的密码/密码/样式进行解锁。可以通过以下方式完成:

promptInfo = BiometricPrompt.PromptInfo.Builder()
        .setTitle("Biometric login for my app")
        .setSubtitle("Log in using your biometric credential")
        // Cannot call setNegativeButtonText() and
        // setDeviceCredentialAllowed() at the same time.
        // .setNegativeButtonText("Use account password")
        .setDeviceCredentialAllowed(true)
        .build()

有关加密的其他信息和详细信息,可以在这里找到:https://developer.android.com/training/sign-in/biometric-auth