Android 指纹 API - 从 Samsung Spass 迁移
Android fingerprint API - migrating from Samsung Spass
假设我有一个使用指纹来验证用户身份的应用程序。在 Android 5 上,我仅将 Samsung Spass 库用于 Samsung 设备。在 Android M 版本中,我添加了对许多设备的支持。首先我检查我是否是 Android M,然后我是否有一个管理器实例,如果我有一个硬件并且我是否已经注册了指纹:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
FingerprintManager manager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
if (manager != null) {
logger.info("Android native fingerprint manager exists");
if (manager.isHardwareDetected()) {
logger.info("Android native fingerprint manager detected hardware");
if (manager.hasEnrolledFingerprints()) {
logger.info("Android native fingerprint manager has enrolled fingerprints");
}
}
return new AndroidFingerprintHelper(context);
}
}
如果我在这里失败了,我会回退检查 Android 是否是 Samsung 并且它是否安装了 Spass 库。现在的问题是:如果用户在带有 Spass 的 Samsung 上拥有 Lollipop,并且已经登记了指纹。之后升级到AndroidM,没有录入新指纹。 manager.hasEnrolledFingerprints()
return 会是真的吗?换句话说,三星 Spass 库是否与 Android OS 共享其数据?谢谢
经过大量研究和测试,我发现:
在三星 Android M FingerPrintManager
永远不会 null
,但如果指纹是使用 Spass 库(三星本机 SDK)注册的,尝试调用 manager.isHardwareDetected()
将 return false 对于本机 Android 指纹管理器。
如果三星设备支持 Android 原生生物识别库,则使用它,否则使用三星自己的 Spass 库。没有这个,我在使用 Android Pie 时遇到 S9+ 问题。这解决了这个问题。
if (Build.BRAND.equals("samsung")) {
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
FingerprintManager fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
if (fingerprintManager != null && fingerprintManager.isHardwareDetected()) {
return new FingerprintHelperNative(context);
}
}
Log.d(TAG, "Using Samsung fingerprint library. ");
return new FingerprintHelperSamsung(context);
} else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
return new FingerprintHelperNative(context);
} else return null;
假设我有一个使用指纹来验证用户身份的应用程序。在 Android 5 上,我仅将 Samsung Spass 库用于 Samsung 设备。在 Android M 版本中,我添加了对许多设备的支持。首先我检查我是否是 Android M,然后我是否有一个管理器实例,如果我有一个硬件并且我是否已经注册了指纹:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
FingerprintManager manager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
if (manager != null) {
logger.info("Android native fingerprint manager exists");
if (manager.isHardwareDetected()) {
logger.info("Android native fingerprint manager detected hardware");
if (manager.hasEnrolledFingerprints()) {
logger.info("Android native fingerprint manager has enrolled fingerprints");
}
}
return new AndroidFingerprintHelper(context);
}
}
如果我在这里失败了,我会回退检查 Android 是否是 Samsung 并且它是否安装了 Spass 库。现在的问题是:如果用户在带有 Spass 的 Samsung 上拥有 Lollipop,并且已经登记了指纹。之后升级到AndroidM,没有录入新指纹。 manager.hasEnrolledFingerprints()
return 会是真的吗?换句话说,三星 Spass 库是否与 Android OS 共享其数据?谢谢
经过大量研究和测试,我发现:
在三星 Android M FingerPrintManager
永远不会 null
,但如果指纹是使用 Spass 库(三星本机 SDK)注册的,尝试调用 manager.isHardwareDetected()
将 return false 对于本机 Android 指纹管理器。
如果三星设备支持 Android 原生生物识别库,则使用它,否则使用三星自己的 Spass 库。没有这个,我在使用 Android Pie 时遇到 S9+ 问题。这解决了这个问题。
if (Build.BRAND.equals("samsung")) {
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
FingerprintManager fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
if (fingerprintManager != null && fingerprintManager.isHardwareDetected()) {
return new FingerprintHelperNative(context);
}
}
Log.d(TAG, "Using Samsung fingerprint library. ");
return new FingerprintHelperSamsung(context);
} else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
return new FingerprintHelperNative(context);
} else return null;