6

我希望开始使用 Marshmallow Fingerprint Authentication API。我明白要请求许可,我必须使用以下方法:

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

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

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

manager.isHardwareDetected();

manager.hasEnrolledFingerprints();

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

4

4 回答 4

11

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

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

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

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

FingerprintManagerCompat manager = FingerprintManagerCompat.from(mContext);

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

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

于 2016-03-10T17:06:52.607 回答
6

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

于 2016-02-09T21:03:04.220 回答
1

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

FingerprintManagerCompatisHardwareDetected类在较低的 Android 版本中提供方法的向后兼容性,但对于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();
        }
    }
于 2017-07-19T04:40:56.370 回答
1

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

于 2018-07-09T18:30:16.830 回答