我希望开始使用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
权限才能被调用。为什么我要求使用我甚至不知道存在的指纹扫描仪?有没有其他方法可以确定扫描仪是否存在?或者是首先请求许可的唯一方式?
答案 0 :(得分:10)
我刚刚找到了课程FingerprintManagerCompat
,它完全符合您的期望:
协调对指纹硬件的访问的类。
在M之前的平台上,此类的行为与没有指纹硬件可用。
此课程中FingerprintManager
的相同方法不需要USE_FINGERPRINT
权限,您可以在要求USE_FINGERPRINT
权限之前调用它们。
FingerprintManagerCompat manager = FingerprintManagerCompat.from(mContext);
manager.isHardwareDetected();
manager.hasEnrolledFingerprints();
这些方法也会在Marshmallow之前的设备上产生预期的错误结果。
答案 1 :(得分:6)
PackageManager
个实例上的 Try hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)
(您可以通过任意方便getPackageManager()
致电Context
获得一个。)
答案 2 :(得分:1)
FingerprintManager
类支持在 API 23 或更高版本上运行的Android设备,并在运行较低Android版本的设备上引发异常。
FingerprintManagerCompat
类在较低版本的Android版本中提供isHardwareDetected
方法的向后兼容性,但对于 API 23 或更高版本,它总是返回false
我选择了最好的两种并创建了此方法来检查所有Android版本中的FingerPrint传感器硬件支持。
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();
}
}
答案 3 :(得分:1)
@CommonsWare提到了一些重要的hasSystemFeature
。为了安全起见,如果您使用Java,则即使在运行API 23或更高版本的设备上,调用hasSystemFeature
时也请确保调用FingerprintManager
或检查空getSystermService
的返回值。对于Kotlin,请在调用getSystemService
时使用可选变量并进行智能强制转换,以免在没有指纹硬件但运行API 23或更高版本的设备中出现无法预料的崩溃。