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 或更高的设备上发生不可预测的崩溃。
我希望开始使用 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 或更高的设备上发生不可预测的崩溃。