【问题标题】:How can I use Android's Face Unlock within my own private application? [closed]如何在我自己的私人应用程序中使用 Android 的人脸解锁? [关闭]
【发布时间】:2013-09-24 03:26:17
【问题描述】:

我想在我的应用中使用人脸解锁作为第二个因素,因为我的大多数用户不会使用密码锁定他们的手机。

是否有可用于在 Android 应用中集成人脸解锁的 Android API?

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

如果您需要一个真实世界的示例,请假设这是一个密码管理器,否则手机将被借给孩子......并且所有者永远不会锁定手机。人脸解锁将保护他们需要私密的东西。

【问题讨论】:

  • @LamonteCristo 如果这不是您想要的,请告诉我,以便我可以修改/添加到我的答案,因为如果没有选择答案,赏金将减半,这样我可以提供特定于您的应用需求的信息
  • 谢谢@Steve,现在美国东部标准时间凌晨 3 点是我唯一可以专注于此的时间。很好的答案。 Fisher 面孔似乎是 Eigenfaces 的特殊版本。两者似乎都适合在照片中标记朋友。找出适合安全操作的方法、阈值和配置会很有帮助

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


【解决方案1】:

对于那些不想阅读的人: 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

我了解无法离线完成此任务的问题。为了解决这个问题,您始终可以添加“备份”,例如普通密码,只有在发现用户无法访问互联网后才会生效。另一种解决方案是只需要一个稳定的互联网/蜂窝连接来让您的应用运行。

编辑:不幸的是,

人脸解锁是谷歌的闭源专有代码,所以我们没有机会修改它。 来源:http://forum.xda-developers.com/showthread.php?t=1367610

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

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

您还需要在后台运行它,定期检查用户的面部,而不会表明正在发生这种情况,因此在选择库/方法时应牢记这一点

资料来源:不久前,我实施了人脸识别技术作为用户登录我的一个应用程序的一种方式,所以我只是在讲述我在寻找相同问题的答案时所记得的内容

你的场景:

如果您需要一个真实世界的示例,请假设这是一个密码管理器,否则手机将被借给孩子......并且所有者永远不会锁定手机。人脸解锁将保护他们需要私密的东西。

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

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

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

【讨论】:

  • 你所有的opencv链接都过期了。
  • @HiteshSarsava 我刚刚检查过,它们工作正常。
  • @HiteshSarsava 您所指的“OpenCV”链接可以通过谷歌搜索“OpenCV”并查看第一个结果来找到。
【解决方案2】:

目前,您可以使用 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()

此外,您可能需要为用户设置回退以使用设备密码/密码/图案解锁。它是通过以下方式完成的:

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

【讨论】:

  • 它不适用于所有 Android 设备。我正在使用一加,我总是在设备中弹出指纹。您能建议显示 faceId 弹出窗口的解决方案吗?
  • 这里也一样。人脸 id 识别不适用于生物识别 api。
猜你喜欢
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多