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;