我想使用Face Unlock作为我的应用的第二个因素,因为我的大多数用户都不会使用密码锁定手机。
是否有Android API可以在Android应用中集成Face Unlock?
有用于照片识别的人脸检测API,但我找不到可用于离线场景的API,特别是应用程序中的其他因素。
如果你需要一个真实世界的例子,假设这是一个密码管理器,或者电话将借给孩子......并且所有者永远不会锁定电话。面部解锁将确保他们需要私密的东西。
答案 0 :(得分:10)
这是一个难以回答的问题,因为现有的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()
此外,您可能需要设置后备状态,以便用户使用设备的密码/密码/样式进行解锁。可以通过以下方式完成:
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