android: biometry: catch java import errors
Catch JavaError when trying to load the java classes of the biometry module on startup. This can raise if the device is on an old API version and the loaded java class depends on apis unknown to the os. Fixes #10470 ``` 02-17 10:07:25.714 5254 5270 I python : 0.47 | E | __main__ | daemon.run_gui errored 02-17 10:07:25.714 5254 5270 I python : Traceback (most recent call last): 02-17 10:07:25.714 5254 5270 I python : File "app/main.py", line 514, in handle_cmd 02-17 10:07:25.714 5254 5270 I python : File "app/electrum/daemon.py", line 653, in run_gui 02-17 10:07:25.714 5254 5270 I python : File "app/electrum/gui/qml/__init__.py", line 38, in <module> 02-17 10:07:25.714 5254 5270 I python : File "app/electrum/gui/qml/qeapp.py", line 49, in <module> 02-17 10:07:25.714 5254 5270 I python : File "app/electrum/gui/qml/qebiometrics.py", line 33, in <module> 02-17 10:07:25.714 5254 5270 I python : File "jnius/reflect.py", line 243, in autoclass 02-17 10:07:25.714 5254 5270 I python : File "jnius/jnius_export_class.pxi", line 877, in jnius.jnius.JavaMethod.__call__ 02-17 10:07:25.714 5254 5270 I python : File "jnius/jnius_export_class.pxi", line 964, in jnius.jnius.JavaMethod.call_method 02-17 10:07:25.714 5254 5270 I python : File "jnius/jnius_utils.pxi", line 79, in jnius.jnius.check_exception 02-17 10:07:25.714 5254 5270 I python : jnius.jnius.JavaException: JVM exception occurred: Failed resolution of: Landroid/hardware/biometrics/BiometricPrompt$AuthenticationResult; java.lang.NoClassDefFoundError ```
This commit is contained in:
@@ -26,13 +26,16 @@ jIntent = None
|
||||
jString = None
|
||||
|
||||
if 'ANDROID_DATA' in os.environ:
|
||||
from jnius import autoclass
|
||||
from jnius import autoclass, JavaException
|
||||
from android import activity
|
||||
jPythonActivity = autoclass('org.kivy.android.PythonActivity').mActivity
|
||||
jBiometricHelper = autoclass('org.electrum.biometry.BiometricHelper')
|
||||
jBiometricActivity = autoclass('org.electrum.biometry.BiometricActivity')
|
||||
jIntent = autoclass('android.content.Intent')
|
||||
jString = autoclass('java.lang.String')
|
||||
try:
|
||||
jPythonActivity = autoclass('org.kivy.android.PythonActivity').mActivity
|
||||
jIntent = autoclass('android.content.Intent')
|
||||
jString = autoclass('java.lang.String')
|
||||
jBiometricActivity = autoclass('org.electrum.biometry.BiometricActivity')
|
||||
jBiometricHelper = autoclass('org.electrum.biometry.BiometricHelper')
|
||||
except JavaException as e:
|
||||
_logger.error(f"Could not load Biometric java classes (maybe due to old api version): {e}")
|
||||
|
||||
|
||||
class BiometricAction(str, Enum):
|
||||
@@ -56,7 +59,7 @@ class QEBiometrics(AuthMixin, QObject):
|
||||
|
||||
@pyqtProperty(bool, constant=True)
|
||||
def isAvailable(self) -> bool:
|
||||
if 'ANDROID_DATA' not in os.environ:
|
||||
if 'ANDROID_DATA' not in os.environ or jBiometricHelper is None:
|
||||
return False
|
||||
try:
|
||||
return jBiometricHelper.isAvailable(jPythonActivity)
|
||||
|
||||
Reference in New Issue
Block a user