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

时间:2016-02-09 20:54:44

标签: android android-permissions android-6.0-marshmallow android-fingerprint-api

我希望开始使用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 个答案:

答案 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或更高版本的设备中出现无法预料的崩溃。