From 0a05674f2ff497d49c9fe13383221fe3047bb903 Mon Sep 17 00:00:00 2001 From: f321x Date: Tue, 24 Jun 2025 17:38:03 +0200 Subject: [PATCH] android: replace qr code scanning library Replaces the unmaintained and unreliable `me.dm7.barcodescanner:zxing:1.9.8` qr code scanning library used only on android with the `com.github.markusfisch:BarcodeScannerView:1.6.0` (https://github.com/markusfisch/BarcodeScannerView) library which seems more actively maintained. The `BarcodeScannerView` library is incredibly fast and scanning qr codes is now fun again :) wip: still looking into ways to pin the library. --- contrib/android/buildozer_qml.spec | 6 +++- .../electrum/qr/SimpleScannerActivity.java | 30 +++++++++---------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/contrib/android/buildozer_qml.spec b/contrib/android/buildozer_qml.spec index 7e0d32330..59da3d80e 100644 --- a/contrib/android/buildozer_qml.spec +++ b/contrib/android/buildozer_qml.spec @@ -160,9 +160,13 @@ android.add_jars = .buildozer/android/platform/*/build/libs_collections/Electrum # directory containing the files) android.add_src = electrum/gui/qml/java_classes/ +# (list) Gradle repositories to add {can be necessary for some android.gradle_dependencies} +# e.g. android.gradle_repositories = maven { url "https://repo.spring.io/release" } +android.add_gradle_repositories = maven { url "https://jitpack.io" } + android.gradle_dependencies = com.android.support:support-compat:28.0.0, - me.dm7.barcodescanner:zxing:1.9.8 + com.github.markusfisch:BarcodeScannerView:1.6.0 android.add_activities = org.electrum.qr.SimpleScannerActivity diff --git a/electrum/gui/qml/java_classes/org/electrum/qr/SimpleScannerActivity.java b/electrum/gui/qml/java_classes/org/electrum/qr/SimpleScannerActivity.java index 0f356719f..71e2785c0 100644 --- a/electrum/gui/qml/java_classes/org/electrum/qr/SimpleScannerActivity.java +++ b/electrum/gui/qml/java_classes/org/electrum/qr/SimpleScannerActivity.java @@ -20,17 +20,15 @@ import androidx.core.app.ActivityCompat; import java.util.Arrays; -import me.dm7.barcodescanner.zxing.ZXingScannerView; +import de.markusfisch.android.barcodescannerview.widget.BarcodeScannerView; -import com.google.zxing.Result; -import com.google.zxing.BarcodeFormat; import org.electrum.electrum.res.R; // package set in build.gradle -public class SimpleScannerActivity extends Activity implements ZXingScannerView.ResultHandler { +public class SimpleScannerActivity extends Activity { private static final int MY_PERMISSIONS_CAMERA = 1002; - private ZXingScannerView mScannerView = null; + private BarcodeScannerView mScannerView = null; final String TAG = "org.electrum.SimpleScannerActivity"; private boolean mAlreadyRequestedPermissions = false; @@ -85,23 +83,23 @@ public class SimpleScannerActivity extends Activity implements ZXingScannerView. public void onPause() { super.onPause(); if (null != mScannerView) { - mScannerView.stopCamera(); // Stop camera on pause + mScannerView.close(); // Stop camera on pause } } private void startCamera() { - mScannerView = new ZXingScannerView(this); - mScannerView.setFormats(Arrays.asList(BarcodeFormat.QR_CODE)); + mScannerView = new BarcodeScannerView(this); + mScannerView.setCropRatio(0.75f); // Set crop ratio to 75% (this defines the square area shown in the scanner view) + // by default only Format.QR_CODE is set ViewGroup contentFrame = (ViewGroup) findViewById(R.id.content_frame); contentFrame.addView(mScannerView); - mScannerView.setResultHandler(this); // Register ourselves as a handler for scan results. - mScannerView.startCamera(); // Start camera on resume - } - - @Override - public void handleResult(Result rawResult) { - //resultIntent.putExtra("format", rawResult.getBarcodeFormat().toString()); - this.setResultAndClose(rawResult.getText()); + mScannerView.setOnBarcodeListener(result -> { + // Handle the scan result + this.setResultAndClose(result.getText()); + // Return false to stop scanning after first result + return false; + }); + mScannerView.openAsync(); // Start camera on resume } private void setResultAndClose(String resultText) {