Skip to content

Commit d4f1445

Browse files
bauerjecdsa
authored andcommitted
Bundle QR scanner with Android app
1 parent 498a269 commit d4f1445

3 files changed

Lines changed: 65 additions & 35 deletions

File tree

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package org.electrum.qr;
2+
3+
import android.app.Activity;
4+
import android.os.Bundle;
5+
import android.util.Log;
6+
import android.content.Intent;
7+
8+
import java.util.Arrays;
9+
10+
import me.dm7.barcodescanner.zxing.ZXingScannerView;
11+
12+
import com.google.zxing.Result;
13+
import com.google.zxing.BarcodeFormat;
14+
15+
public class SimpleScannerActivity extends Activity implements ZXingScannerView.ResultHandler {
16+
private ZXingScannerView mScannerView;
17+
final String TAG = "org.electrum.SimpleScannerActivity";
18+
19+
@Override
20+
public void onCreate(Bundle state) {
21+
super.onCreate(state);
22+
mScannerView = new ZXingScannerView(this); // Programmatically initialize the scanner view
23+
mScannerView.setFormats(Arrays.asList(BarcodeFormat.QR_CODE));
24+
setContentView(mScannerView); // Set the scanner view as the content view
25+
}
26+
27+
@Override
28+
public void onResume() {
29+
super.onResume();
30+
mScannerView.setResultHandler(this); // Register ourselves as a handler for scan results.
31+
mScannerView.startCamera(); // Start camera on resume
32+
}
33+
34+
@Override
35+
public void onPause() {
36+
super.onPause();
37+
mScannerView.stopCamera(); // Stop camera on pause
38+
}
39+
40+
@Override
41+
public void handleResult(Result rawResult) {
42+
Intent resultIntent = new Intent();
43+
resultIntent.putExtra("text", rawResult.getText());
44+
resultIntent.putExtra("format", rawResult.getBarcodeFormat().toString());
45+
setResult(Activity.RESULT_OK, resultIntent);
46+
this.finish();
47+
}
48+
}

gui/kivy/main_window.py

Lines changed: 10 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -384,45 +384,22 @@ def qr_dialog(self, title, data, show_text=False):
384384
def scan_qr(self, on_complete):
385385
if platform != 'android':
386386
return
387-
from jnius import autoclass
387+
from jnius import autoclass, cast
388388
from android import activity
389389
PythonActivity = autoclass('org.kivy.android.PythonActivity')
390+
SimpleScannerActivity = autoclass("org.electrum.qr.SimpleScannerActivity")
390391
Intent = autoclass('android.content.Intent')
391-
intent = Intent("com.google.zxing.client.android.SCAN")
392-
intent.putExtra("SCAN_MODE", "QR_CODE_MODE")
393-
def on_qr_result(requestCode, resultCode, intent):
394-
if requestCode == 0:
395-
if resultCode == -1: # RESULT_OK:
396-
contents = intent.getStringExtra("SCAN_RESULT")
397-
if intent.getStringExtra("SCAN_RESULT_FORMAT") == 'QR_CODE':
398-
on_complete(contents)
399-
else:
400-
self.show_error("wrong format " + intent.getStringExtra("SCAN_RESULT_FORMAT"))
401-
activity.bind(on_activity_result=on_qr_result)
402-
try:
403-
PythonActivity.mActivity.startActivityForResult(intent, 0)
404-
except:
405-
self.show_error(_('Could not start Barcode Scanner.') + ' ' + _('Please install the Barcode Scanner app from ZXing'))
392+
intent = Intent(PythonActivity.mActivity, SimpleScannerActivity)
406393

407-
def scan_qr_zxing(self, on_complete):
408-
# uses zxing embedded lib
409-
if platform != 'android':
410-
return
411-
from jnius import autoclass
412-
from android import activity
413-
PythonActivity = autoclass('org.kivy.android.PythonActivity')
414-
IntentIntegrator = autoclass('com.google.zxing.integration.android.IntentIntegrator')
415-
integrator = IntentIntegrator(PythonActivity.mActivity)
416394
def on_qr_result(requestCode, resultCode, intent):
417-
if requestCode == 0:
418-
if resultCode == -1: # RESULT_OK:
419-
contents = intent.getStringExtra("SCAN_RESULT")
420-
if intent.getStringExtra("SCAN_RESULT_FORMAT") == 'QR_CODE':
421-
on_complete(contents)
422-
else:
423-
self.show_error("wrong format " + intent.getStringExtra("SCAN_RESULT_FORMAT"))
395+
if resultCode == -1: # RESULT_OK:
396+
# this doesn't work due to some bug in jnius:
397+
# contents = intent.getStringExtra("text")
398+
String = autoclass("java.lang.String")
399+
contents = intent.getStringExtra(String("text"))
400+
on_complete(contents)
424401
activity.bind(on_activity_result=on_qr_result)
425-
integrator.initiateScan()
402+
PythonActivity.mActivity.startActivityForResult(intent, 0)
426403

427404
def do_share(self, data, title):
428405
if platform != 'android':

gui/kivy/tools/buildozer.spec

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ fullscreen = False
5252
#
5353

5454
# (list) Permissions
55-
android.permissions = INTERNET, WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE
55+
android.permissions = INTERNET, WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE, CAMERA
56+
5657
# (int) Android API to use
5758
#android.api = 14
5859

@@ -86,7 +87,11 @@ android.ndk_path = /opt/crystax-ndk-10.3.2
8687

8788
# (list) List of Java files to add to the android project (can be java or a
8889
# directory containing the files)
89-
#android.add_src =
90+
android.add_src = gui/kivy/data/java-classes/
91+
92+
android.gradle_dependencies = me.dm7.barcodescanner:zxing:1.9.8
93+
94+
android.add_activities = org.electrum.qr.SimpleScannerActivity
9095

9196
# (str) python-for-android branch to use, if not master, useful to try
9297
# not yet merged features.

0 commit comments

Comments
 (0)