Skip to content

Commit 9194fa2

Browse files
committed
优化扫码策略
1 parent 549783c commit 9194fa2

13 files changed

Lines changed: 105 additions & 37 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ C++ port of ZXing for Android
99
### 使用
1010
在gradle中:
1111
``` groovy
12-
implementation 'me.devilsen:CZXing:0.9.3'
12+
implementation 'me.devilsen:CZXing:0.9.6'
1313
```
1414
建议加入abiFilters
1515
```gradle

czxing/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ android {
77
minSdkVersion rootProject.ext.minSdkVersion
88
targetSdkVersion rootProject.ext.targetSdkVersion
99
versionCode 19
10-
versionName "0.9.5"
10+
versionName "0.9.6"
1111

1212
externalNativeBuild {
1313
cmake {

czxing/src/main/cpp/ImageScheduler.cpp

Lines changed: 54 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ ImageScheduler::~ImageScheduler() {
3333
delete &stopProcessing;
3434
delete &cameraLight;
3535
delete &prepareThread;
36+
scanIndex = 0;
3637
}
3738

3839
void *prepareMethod(void *arg) {
@@ -49,6 +50,7 @@ void ImageScheduler::start() {
4950
stopProcessing.store(false);
5051
isProcessing.store(false);
5152
frameQueue.setWork(1);
53+
scanIndex = 0;
5254

5355
while (true) {
5456
if (stopProcessing.load()) {
@@ -74,6 +76,7 @@ void ImageScheduler::stop() {
7476
stopProcessing.store(true);
7577
frameQueue.setWork(0);
7678
frameQueue.clear();
79+
scanIndex = 0;
7780
}
7881

7982
void
@@ -109,7 +112,8 @@ ImageScheduler::process(jbyte *bytes, int left, int top, int cropWidth, int crop
109112
*/
110113
void ImageScheduler::preTreatMat(const FrameData &frameData) {
111114
try {
112-
LOGE("start preTreatMat...");
115+
scanIndex++;
116+
LOGE("start preTreatMat..., scanIndex = %d", scanIndex);
113117

114118
Mat src(frameData.rowHeight + frameData.rowHeight / 2,
115119
frameData.rowWidth, CV_8UC1,
@@ -128,7 +132,12 @@ void ImageScheduler::preTreatMat(const FrameData &frameData) {
128132
if (cameraLight < 40) {
129133
return;
130134
}
131-
decodeGrayPixels(gray);
135+
136+
if (scanIndex % 2 == 0) {
137+
decodeGrayPixels(gray);
138+
} else {
139+
decodeZBar(gray);
140+
}
132141
} catch (const std::exception &e) {
133142
LOGE("preTreatMat error...");
134143
}
@@ -144,11 +153,38 @@ void ImageScheduler::decodeGrayPixels(const Mat &gray) {
144153

145154
if (result.isValid()) {
146155
javaCallHelper->onResult(result);
147-
}else {
156+
LOGE("ZXing GrayPixels Success, scanIndex = %d", scanIndex);
157+
} else {
148158
decodeThresholdPixels(gray);
149159
}
150160
}
151161

162+
void ImageScheduler::decodeZBar(const Mat &gray) {
163+
auto width = static_cast<unsigned int>(gray.cols);
164+
auto height = static_cast<unsigned int>(gray.rows);
165+
166+
const void *raw = gray.data;
167+
Image image(width, height, "Y800", raw, width * height);
168+
int n = zbarScanner->scan(image);
169+
170+
if (n > 0) {
171+
Image::SymbolIterator symbol = image.symbol_begin();
172+
LOGE("zbar GrayPixels Success Data = %s scanIndex = %d", symbol->get_data().c_str(),
173+
scanIndex);
174+
175+
if (symbol->get_type() == zbar_symbol_type_e::ZBAR_QRCODE) {
176+
Result result(DecodeStatus::NoError);
177+
result.setFormat(BarcodeFormat::QR_CODE);
178+
result.setText(ANSIToUnicode(symbol->get_data()));
179+
javaCallHelper->onResult(result);
180+
image.set_data(nullptr, 0);
181+
}
182+
} else {
183+
image.set_data(nullptr, 0);
184+
decodeAdaptivePixels(gray);
185+
}
186+
}
187+
152188
void ImageScheduler::decodeThresholdPixels(const Mat &gray) {
153189
LOGE("start ThresholdPixels...");
154190

@@ -164,13 +200,17 @@ void ImageScheduler::decodeThresholdPixels(const Mat &gray) {
164200

165201
Result result = decodePixels(mat);
166202
if (result.isValid()) {
203+
LOGE("ZXing Threshold Success, scanIndex = %d", scanIndex);
167204
javaCallHelper->onResult(result);
168205
} else {
169-
decodeAdaptivePixels(gray);
206+
recognizerQrCode(gray);
170207
}
171208
}
172209

173210
void ImageScheduler::decodeAdaptivePixels(const Mat &gray) {
211+
if (scanIndex % 3 != 0) {
212+
return;
213+
}
174214
LOGE("start AdaptivePixels...");
175215

176216
Mat mat;
@@ -185,39 +225,22 @@ void ImageScheduler::decodeAdaptivePixels(const Mat &gray) {
185225

186226
Result result = decodePixels(lightMat);
187227
if (result.isValid()) {
228+
LOGE("ZXing Adaptive Success, scanIndex = %d", scanIndex);
188229
javaCallHelper->onResult(result);
189230
} else {
190-
decodeZBar(gray);
191-
// recognizerQrCode(gray);
192-
}
193-
}
194-
195-
void ImageScheduler::decodeZBar(const Mat &gray) {
196-
auto width = static_cast<unsigned int>(gray.cols);
197-
auto height = static_cast<unsigned int>(gray.rows);
198-
199-
const void *raw = gray.data;
200-
Image image(width, height, "Y800", raw, width * height);
201-
int n = zbarScanner->scan(image);
202-
203-
if (n > 0) {
204-
Image::SymbolIterator symbol = image.symbol_begin();
205-
LOGE("zbar Code Data = %s", symbol->get_data().c_str());
206-
207-
if (symbol->get_type() == zbar_symbol_type_e::ZBAR_QRCODE) {
208-
Result result(DecodeStatus::NoError);
209-
result.setFormat(BarcodeFormat::QR_CODE);
210-
result.setText(ANSIToUnicode(symbol->get_data()));
211-
javaCallHelper->onResult(result);
212-
image.set_data(nullptr, 0);
213-
}
214-
} else {
215-
image.set_data(nullptr, 0);
216231
recognizerQrCode(gray);
217232
}
218233
}
219234

220235
void ImageScheduler::recognizerQrCode(const Mat &mat) {
236+
if (scanIndex % 7 == 0) {
237+
javaCallHelper->onFocus();
238+
return;
239+
}
240+
241+
if (scanIndex % 3 != 0) {
242+
return;
243+
}
221244
LOGE("start recognizerQrCode...");
222245

223246
cv::Rect rect;
@@ -240,7 +263,7 @@ void ImageScheduler::recognizerQrCode(const Mat &mat) {
240263

241264
javaCallHelper->onResult(result);
242265

243-
LOGE("end recognizerQrCode...");
266+
LOGE("end recognizerQrCode..., scanIndex = %d", scanIndex);
244267
}
245268

246269
Result ImageScheduler::decodePixels(const Mat &mat) {

czxing/src/main/cpp/ImageScheduler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class ImageScheduler {
6868
ImageScanner *zbarScanner;
6969
QRCodeRecognizer *qrCodeRecognizer;
7070
SafeQueue<FrameData> frameQueue;
71+
int scanIndex;
7172

7273
pthread_t prepareThread{};
7374

czxing/src/main/cpp/JavaCallHelper.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ JavaCallHelper::JavaCallHelper(JavaVM *_javaVM, JNIEnv *_env, jobject &_jobj) :
3636
}
3737

3838
jmid_on_result = env->GetMethodID(jSdkClass, "onDecodeCallback", "(Ljava/lang/String;I[F)V");
39+
jmid_on_focus = env->GetMethodID(jSdkClass, "onFocusCallback", "()V");
3940
jmid_on_brightness = env->GetMethodID(jSdkClass, "onBrightnessCallback", "(Z)V");
4041

4142
if (jmid_on_result == nullptr) {
@@ -108,6 +109,25 @@ void JavaCallHelper::onResult(const ZXing::Result &result) {
108109

109110
}
110111

112+
void JavaCallHelper::onFocus() {
113+
int getEnvStat = javaVM->GetEnv((void **) &env, JNI_VERSION_1_6);
114+
int mNeedDetach = JNI_FALSE;
115+
if (getEnvStat == JNI_EDETACHED) {
116+
//如果没有, 主动附加到jvm环境中,获取到env
117+
if (javaVM->AttachCurrentThread(&env, nullptr) != JNI_OK) {
118+
return;
119+
}
120+
mNeedDetach = JNI_TRUE;
121+
}
122+
123+
env->CallVoidMethod(jSdkObject, jmid_on_focus);
124+
125+
//释放当前线程
126+
if (mNeedDetach) {
127+
javaVM->DetachCurrentThread();
128+
}
129+
}
130+
111131
void JavaCallHelper::onBrightness(const bool isDark) {
112132
int getEnvStat = javaVM->GetEnv((void **) &env, JNI_VERSION_1_6);
113133
int mNeedDetach = JNI_FALSE;

czxing/src/main/cpp/JavaCallHelper.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,16 @@ class JavaCallHelper {
1717

1818
void onResult(const ZXing::Result &result);
1919

20+
void onFocus();
21+
2022
void onBrightness(const bool isDark);
2123

2224
private:
2325
JavaVM *javaVM;
2426
JNIEnv *env;
2527
jobject jSdkObject;
2628
jmethodID jmid_on_result;
29+
jmethodID jmid_on_focus;
2730
jmethodID jmid_on_brightness;
2831

2932
};

czxing/src/main/java/me/devilsen/czxing/camera/CameraSurface.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ private void doubleTap() {
214214
*/
215215
@Override
216216
public void onFrozen() {
217-
BarCodeUtil.d("mCamera is frozen, start focus");
217+
BarCodeUtil.d("mCamera is frozen, start focus x = " + focusCenter.x + " y = "+ focusCenter.y);
218218
handleFocus(focusCenter.x, focusCenter.y);
219219
}
220220

czxing/src/main/java/me/devilsen/czxing/code/BarcodeReader.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ public void setReadCodeListener(ReadCodeListener readCodeListener) {
8888
public interface ReadCodeListener {
8989
void onReadCodeResult(CodeResult result);
9090

91+
void onFocus();
92+
9193
void onAnalysisBrightness(boolean isDark);
9294
}
9395
}

czxing/src/main/java/me/devilsen/czxing/code/NativeSdk.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,16 @@ public void onDecodeCallback(String content, int formatIndex, float[] points) {
4040
}
4141
}
4242

43+
/**
44+
* Native Callback for focus
45+
*
46+
*/
47+
public void onFocusCallback() {
48+
if (readCodeListener != null) {
49+
readCodeListener.onFocus();
50+
}
51+
}
52+
4353
/**
4454
* Native callback for brightness
4555
*

czxing/src/main/java/me/devilsen/czxing/util/SoundPoolUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class SoundPoolUtil {
1818
private int mSoundId = -1;
1919

2020
public SoundPoolUtil() {
21-
mSoundPool = new SoundPool(1, AudioManager.STREAM_NOTIFICATION, 0);
21+
mSoundPool = new SoundPool(1, AudioManager.STREAM_RING, 0);
2222
}
2323

2424
public void loadDefault(Context context) {

0 commit comments

Comments
 (0)