0

假设我有一个使用指纹对用户进行身份验证的应用程序。在 Android 5 上,我仅将 Samsung Spas 库用于三星设备。随着 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 是否是三星并且它是否安装了 Spass 库。现在的问题是:如果用户使用 Spass 在三星上拥有 Lollipop 并注册了指纹。之后他升级到 Android M没有注册新的指纹。会manager.hasEnrolledFingerprints()回归真实吗?换句话说,三星 Spass 库是否与 Android 操作系统共享其数据?谢谢。

4

2 回答 2

1

经过大量研究和测试后,我发现:在带有 Android M 的三星上FingerPrintManager永远不会null,但如果指纹是使用 Spass 库(三星原生 SDK)注册的,则尝试调用manager.isHardwareDetected()将为原生 Android 指纹管理器返回 false。

于 2016-09-21T12:34:35.683 回答
0

如果三星设备支持 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;
于 2019-01-29T16:10:52.137 回答