Marshmallow 指纹扫描仪硬件存在

Marshmallow Fingerprint Scanner Hardware Presence

我希望开始使用 Marshmallow 指纹验证 API。我明白要请求权限,我必须使用以下方法:

ContextCompat.checkSelfPermission(getContext(), Manifest.permission.USE_FINGERPRINT);

而且我必须检查设备是否 运行 API 级别 23 或更高。但在我请求许可之前,我想首先检查该设备是否真的有指纹扫描仪。我找到了以下两种方法来进行此检查:

FingerprintManager manager = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE);

manager.isHardwareDetected();

manager.hasEnrolledFingerprints();

但这两种方法都需要 USE_FINGERPRINT 权限才能调用。为什么我要申请使用我什至不知道存在的指纹扫描仪的许可?还有其他方法可以查明扫描仪是否存在吗?还是只有先征求许可才行?

Try hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)PackageManager 实例上(你可以通过调用 getPackageManager() 在任何方便的 Context 上获得一个)。

我刚找到 class FingerprintManagerCompat,它完全符合您的预期:

A class that coordinates access to the fingerprint hardware.

On platforms before M, this class behaves as there would be no fingerprint hardware available.

此 class 中来自 FingerprintManager 的相同方法不需要 USE_FINGERPRINT 许可,使您能够在请求 USE_FINGERPRINT 许可之前调用它们。

FingerprintManagerCompat manager = FingerprintManagerCompat.from(mContext);

manager.isHardwareDetected();
manager.hasEnrolledFingerprints();

这些方法也会在 Marshmallow 之前的设备上产生预期的错误结果。

FingerprintManager class 在 API 上支持 Android 设备 运行 23 或更高版本并在设备 运行 较低 Android 版本上引发异常。

FingerprintManagerCompat class 在较低的 Android 版本中提供 isHardwareDetected 方法的向后兼容性,但它总是 returns false API 23 或更高

我从两者中选出了最好的,并创建了这个方法来检查所有 Android 版本 中的指纹传感器硬件支持。

  private boolean isSensorAvialable() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            return ActivityCompat.checkSelfPermission(AppContext, Manifest.permission.USE_FINGERPRINT) == PackageManager.PERMISSION_GRANTED &&
                    AppContext.getSystemService(FingerprintManager.class).isHardwareDetected();
        } else {
            return FingerprintManagerCompat.from(AppContext).isHardwareDetected();
        }
    }

@CommonsWare 提到了一些重要的事情,hasSystemFeature。为了安全起见,如果您使用 Java,请确保您在调用 getSystermService 时调用 hasSystemFeature 或检查 null FingerprintManager return 值,即使是在设备上运行 API 23 或更高。对于 Kotlin,在调用 getSystemService 时使用可选变量并进行智能转换,以避免在没有指纹硬件但 运行 API 23 或更高的设备上发生不可预测的崩溃。