From f573ab2d5653522fb4b9ede2f1fe90feb51f401c Mon Sep 17 00:00:00 2001 From: f321x Date: Tue, 17 Feb 2026 10:17:00 +0100 Subject: [PATCH] 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 02-17 10:07:25.714 5254 5270 I python : File "app/electrum/gui/qml/qeapp.py", line 49, in 02-17 10:07:25.714 5254 5270 I python : File "app/electrum/gui/qml/qebiometrics.py", line 33, in 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 ``` --- electrum/gui/qml/qebiometrics.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/electrum/gui/qml/qebiometrics.py b/electrum/gui/qml/qebiometrics.py index 3d806a68a..b2d896bd1 100644 --- a/electrum/gui/qml/qebiometrics.py +++ b/electrum/gui/qml/qebiometrics.py @@ -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)