I have a DialogFragment
that handles login and fingerprint authentication for my application. This fragment uses two classes that are exclusive to API 23,
As you said the problem is with that catch block
catch (KeyPermanentlyInvalidatedException exception) {
Timber.w(exception, "A new fingerprint was added to the device");
handleKeyPermanentlyInvalidated();
return false;
}
Because that exception is added on API LEVEL 23, but I don't know why the verify error is thrown at initialization time itself.
Anyway you can catch the exception using
catch (InvalidKeyExceptionexception) {
....
return false;
}
since KeyPermanentlyInvalidatedException
extends InvalidKeyExceptionexception
I had the same error and solved it the following way:
catch (Exception e) {
if (e instanceof KeyPermanentlyInvalidatedException) {
//your error handling goes here
}
It isn't vey nice, but it works
My guess is that either FingerprintCallback.Callback
extends an API Level 23+ interface or that LoginFragment
has fields that reference API Level 23+ stuff.
Your rule about being able to call API Level 23+ methods safely inside the version guard block is correct. However, you cannot:
In many cases, we don't need any of that, in which case just checking Build.VERSION.SDK_INT
before calling API Level 23+ methods is sufficient.
If you need to do some of the things in the bulleted list, that's fine, but then you need to isolate those into classes that you only use on API Level 23+ devices.
So, for example, let's pretend that the problem is that FingerprintCallback.Callback
extends some API Level 23+ interface. Rather than implementing FingerprintCallback.Callback
on the LoginFragment
, you might implement that as an anonymous inner class, and only execute the code creating that anonymous inner class instance if Build.VERSION.SDK_INT
is high enough. Then, you only are referencing FingerprintCallback.Callback
on the newer devices, and you should be safe.