我希望开始使用棉花糖指纹认证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 或更高版本的设备在野外发生不可预测的崩溃。