棉花糖指纹扫描仪硬件存在



我希望开始使用棉花糖指纹认证API。我了解要请求许可,我必须使用以下方法:

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

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

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

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

我刚刚找到了类FingerprintManagerCompat,它完全符合您的期望:

协调对指纹硬件的访问的类。

在 M 之前的平台上,此类的行为就像没有可用的指纹硬件一样。

此类中 FingerprintManager 中的相同方法不需要USE_FINGERPRINT权限,使您能够在请求USE_FINGERPRINT权限之前调用它们。

FingerprintManagerCompat manager = FingerprintManagerCompat.from(mContext);
manager.isHardwareDetected();
manager.hasEnrolledFingerprints();

这些方法还将在棉花糖前设备上产生预期的错误结果。

尝试在

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

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

FingerprintManagerCompat类在较低的 Android 版本中提供isHardwareDetected方法的向后兼容性,但它始终返回 API 23 或更高版本的 false

我选择了两者中最好的,并创建了此方法来检查所有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返回值,即使在运行 API 23 或更高版本的设备上也是如此。对于 Kotlin,请使用可选变量并在调用 getSystemService 时执行智能强制转换,以避免没有指纹硬件但运行 API 23 或更高版本的设备在野外发生不可预测的崩溃。

相关内容

  • 没有找到相关文章

最新更新