-
Notifications
You must be signed in to change notification settings - Fork 152
Expand file tree
/
Copy pathScanPlugin.java
More file actions
143 lines (125 loc) · 4.59 KB
/
ScanPlugin.java
File metadata and controls
143 lines (125 loc) · 4.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package com.chavesgu.scan;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Build;
import android.os.VibrationEffect;
import android.os.Vibrator;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.common.GlobalHistogramBinarizer;
import com.google.zxing.common.HybridBinarizer;
import com.journeyapps.barcodescanner.CaptureActivity;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import androidx.annotation.NonNull;
import io.flutter.Log;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import static android.content.Context.VIBRATOR_SERVICE;
/** ScanPlugin */
public class ScanPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware {
private MethodChannel channel;
private Activity activity;
private FlutterPluginBinding flutterPluginBinding;
private Result _result;
private QrCodeAsyncTask task;
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
this.flutterPluginBinding = flutterPluginBinding;
}
private void configChannel(ActivityPluginBinding binding) {
activity = binding.getActivity();
channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "chavesgu/scan");
channel.setMethodCallHandler(this);
flutterPluginBinding.getPlatformViewRegistry()
.registerViewFactory("chavesgu/scan_view", new ScanViewFactory(
flutterPluginBinding.getBinaryMessenger(),
flutterPluginBinding.getApplicationContext(),
activity,
binding
));
}
@Override
public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {
configChannel(binding);
}
@Override
public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {
configChannel(binding);
}
@Override
public void onDetachedFromActivityForConfigChanges() {
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
this.flutterPluginBinding = null;
}
@Override
public void onDetachedFromActivity() {
activity = null;
channel.setMethodCallHandler(null);
}
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
_result = result;
if (call.method.equals("getPlatformVersion")) {
result.success("Android " + android.os.Build.VERSION.RELEASE);
} else if (call.method.equals("parse")) {
String path = (String) call.arguments;
task = new QrCodeAsyncTask(this, path);
task.execute(path);
} else {
result.notImplemented();
}
}
/**
* AsyncTask 静态内部类,防止内存泄漏
*/
static class QrCodeAsyncTask extends AsyncTask<String, Integer, String> {
private final WeakReference<ScanPlugin> mWeakReference;
private final String path;
public QrCodeAsyncTask(ScanPlugin plugin, String path) {
mWeakReference = new WeakReference<>(plugin);
this.path = path;
}
@Override
protected String doInBackground(String... strings) {
// 解析二维码/条码
return QRCodeDecoder.decodeQRCode(mWeakReference.get().flutterPluginBinding.getApplicationContext(), path);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
//识别出图片二维码/条码,内容为s
ScanPlugin plugin = (ScanPlugin) mWeakReference.get();
plugin._result.success(s);
plugin.task.cancel(true);
plugin.task = null;
if (s!=null) {
Vibrator myVib = (Vibrator) plugin.flutterPluginBinding.getApplicationContext().getSystemService(VIBRATOR_SERVICE);
if (myVib != null) {
if (Build.VERSION.SDK_INT >= 26) {
myVib.vibrate(VibrationEffect.createOneShot(50, VibrationEffect.DEFAULT_AMPLITUDE));
} else {
myVib.vibrate(50);
}
}
}
}
}
}