react-native-pdf417-scanner 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +304 -0
- package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/results.bin +1 -0
- package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/pdf417scanner/BuildConfig.dex +0 -0
- package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/pdf417scanner/PDF417CameraManager$1.dex +0 -0
- package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/pdf417scanner/PDF417CameraManager$2.dex +0 -0
- package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/pdf417scanner/PDF417CameraManager$3.dex +0 -0
- package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/pdf417scanner/PDF417CameraManager.dex +0 -0
- package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/pdf417scanner/PDF417ScannerConfig.dex +0 -0
- package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/pdf417scanner/PDF417ScannerModule.dex +0 -0
- package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/pdf417scanner/PDF417ScannerPackage.dex +0 -0
- package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
- package/android/build/.transforms/d503444439e8ad92acf84485353ac7d0/results.bin +1 -0
- package/android/build/.transforms/d503444439e8ad92acf84485353ac7d0/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/generated/source/buildConfig/debug/com/pdf417scanner/BuildConfig.java +10 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +20 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +18 -0
- package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +6 -0
- package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +1 -0
- package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
- package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
- package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +0 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
- package/android/build/intermediates/incremental/mergeDebugAssets/merger.xml +2 -0
- package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
- package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/pdf417scanner/BuildConfig.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/pdf417scanner/PDF417CameraManager$1.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/pdf417scanner/PDF417CameraManager$2.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/pdf417scanner/PDF417CameraManager$3.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/pdf417scanner/PDF417CameraManager.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/pdf417scanner/PDF417ScannerConfig.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/pdf417scanner/PDF417ScannerModule.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/pdf417scanner/PDF417ScannerPackage.class +0 -0
- package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +2 -0
- package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +33 -0
- package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +20 -0
- package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +1 -0
- package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/pdf417scanner/BuildConfig.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/pdf417scanner/PDF417CameraManager$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/pdf417scanner/PDF417CameraManager$2.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/pdf417scanner/PDF417CameraManager$3.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/pdf417scanner/PDF417CameraManager.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/pdf417scanner/PDF417ScannerConfig.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/pdf417scanner/PDF417ScannerModule.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/pdf417scanner/PDF417ScannerPackage.class +0 -0
- package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
- package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +1 -0
- package/android/build/outputs/logs/manifest-merger-debug-report.txt +43 -0
- package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
- package/android/build.gradle +31 -0
- package/android/src/main/AndroidManifest.xml +18 -0
- package/android/src/main/java/com/pdf417scanner/PDF417CameraManager.java +283 -0
- package/android/src/main/java/com/pdf417scanner/PDF417ScannerConfig.java +49 -0
- package/android/src/main/java/com/pdf417scanner/PDF417ScannerModule.java +138 -0
- package/android/src/main/java/com/pdf417scanner/PDF417ScannerPackage.java +28 -0
- package/lib/index.d.ts +60 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +125 -0
- package/lib/index.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
package com.pdf417scanner;
|
|
2
|
+
|
|
3
|
+
import android.app.Activity;
|
|
4
|
+
import android.content.Context;
|
|
5
|
+
import android.graphics.ImageFormat;
|
|
6
|
+
import android.hardware.camera2.CameraAccessException;
|
|
7
|
+
import android.hardware.camera2.CameraCaptureSession;
|
|
8
|
+
import android.hardware.camera2.CameraCharacteristics;
|
|
9
|
+
import android.hardware.camera2.CameraDevice;
|
|
10
|
+
import android.hardware.camera2.CameraManager;
|
|
11
|
+
import android.hardware.camera2.CaptureRequest;
|
|
12
|
+
import android.hardware.camera2.params.StreamConfigurationMap;
|
|
13
|
+
import android.media.Image;
|
|
14
|
+
import android.media.ImageReader;
|
|
15
|
+
import android.os.Handler;
|
|
16
|
+
import android.os.HandlerThread;
|
|
17
|
+
import android.util.Log;
|
|
18
|
+
import android.util.Size;
|
|
19
|
+
import android.view.Surface;
|
|
20
|
+
|
|
21
|
+
import androidx.annotation.NonNull;
|
|
22
|
+
|
|
23
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
24
|
+
import com.google.zxing.BarcodeFormat;
|
|
25
|
+
import com.google.zxing.BinaryBitmap;
|
|
26
|
+
import com.google.zxing.DecodeHintType;
|
|
27
|
+
import com.google.zxing.MultiFormatReader;
|
|
28
|
+
import com.google.zxing.PlanarYUVLuminanceSource;
|
|
29
|
+
import com.google.zxing.Result;
|
|
30
|
+
import com.google.zxing.common.HybridBinarizer;
|
|
31
|
+
|
|
32
|
+
import java.nio.ByteBuffer;
|
|
33
|
+
import java.util.Arrays;
|
|
34
|
+
import java.util.EnumMap;
|
|
35
|
+
import java.util.EnumSet;
|
|
36
|
+
import java.util.Map;
|
|
37
|
+
import java.util.concurrent.Semaphore;
|
|
38
|
+
import java.util.concurrent.TimeUnit;
|
|
39
|
+
|
|
40
|
+
public class PDF417CameraManager {
|
|
41
|
+
private static final String TAG = "PDF417CameraManager";
|
|
42
|
+
|
|
43
|
+
private ReactApplicationContext reactContext;
|
|
44
|
+
private PDF417ScannerModule scannerModule;
|
|
45
|
+
private CameraManager cameraManager;
|
|
46
|
+
private CameraDevice cameraDevice;
|
|
47
|
+
private CameraCaptureSession captureSession;
|
|
48
|
+
private ImageReader imageReader;
|
|
49
|
+
private HandlerThread backgroundThread;
|
|
50
|
+
private Handler backgroundHandler;
|
|
51
|
+
private MultiFormatReader multiFormatReader;
|
|
52
|
+
private Semaphore cameraOpenCloseLock = new Semaphore(1);
|
|
53
|
+
private String cameraId;
|
|
54
|
+
private Size previewSize;
|
|
55
|
+
private boolean isScanning = false;
|
|
56
|
+
private PDF417ScannerConfig config;
|
|
57
|
+
|
|
58
|
+
public PDF417CameraManager(ReactApplicationContext reactContext, PDF417ScannerModule scannerModule) {
|
|
59
|
+
this.reactContext = reactContext;
|
|
60
|
+
this.scannerModule = scannerModule;
|
|
61
|
+
this.cameraManager = (CameraManager) reactContext.getSystemService(Context.CAMERA_SERVICE);
|
|
62
|
+
setupBarcodeReader();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
private void setupBarcodeReader() {
|
|
66
|
+
multiFormatReader = new MultiFormatReader();
|
|
67
|
+
Map<DecodeHintType, Object> hints = new EnumMap<>(DecodeHintType.class);
|
|
68
|
+
hints.put(DecodeHintType.POSSIBLE_FORMATS, EnumSet.of(BarcodeFormat.PDF_417));
|
|
69
|
+
hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
|
|
70
|
+
multiFormatReader.setHints(hints);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public void startScanning(PDF417ScannerConfig config) throws Exception {
|
|
74
|
+
this.config = config;
|
|
75
|
+
startBackgroundThread();
|
|
76
|
+
openCamera();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public void stopScanning() {
|
|
80
|
+
isScanning = false;
|
|
81
|
+
closeCamera();
|
|
82
|
+
stopBackgroundThread();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public void setTorchEnabled(boolean enabled) throws CameraAccessException {
|
|
86
|
+
if (captureSession != null && cameraDevice != null) {
|
|
87
|
+
CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
|
|
88
|
+
builder.addTarget(imageReader.getSurface());
|
|
89
|
+
builder.set(CaptureRequest.FLASH_MODE, enabled ?
|
|
90
|
+
CaptureRequest.FLASH_MODE_TORCH : CaptureRequest.FLASH_MODE_OFF);
|
|
91
|
+
captureSession.setRepeatingRequest(builder.build(), null, backgroundHandler);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private void startBackgroundThread() {
|
|
96
|
+
backgroundThread = new HandlerThread("CameraBackground");
|
|
97
|
+
backgroundThread.start();
|
|
98
|
+
backgroundHandler = new Handler(backgroundThread.getLooper());
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private void stopBackgroundThread() {
|
|
102
|
+
if (backgroundThread != null) {
|
|
103
|
+
backgroundThread.quitSafely();
|
|
104
|
+
try {
|
|
105
|
+
backgroundThread.join();
|
|
106
|
+
backgroundThread = null;
|
|
107
|
+
backgroundHandler = null;
|
|
108
|
+
} catch (InterruptedException e) {
|
|
109
|
+
Log.e(TAG, "Error stopping background thread", e);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private void openCamera() throws Exception {
|
|
115
|
+
if (!cameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) {
|
|
116
|
+
throw new RuntimeException("Time out waiting to lock camera opening.");
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
try {
|
|
120
|
+
cameraId = selectCamera();
|
|
121
|
+
if (cameraId == null) {
|
|
122
|
+
throw new RuntimeException("No suitable camera found");
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
setupImageReader();
|
|
126
|
+
cameraManager.openCamera(cameraId, stateCallback, backgroundHandler);
|
|
127
|
+
} catch (CameraAccessException e) {
|
|
128
|
+
throw new RuntimeException("Failed to open camera", e);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
private String selectCamera() throws CameraAccessException {
|
|
133
|
+
for (String cameraId : cameraManager.getCameraIdList()) {
|
|
134
|
+
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
|
|
135
|
+
Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING);
|
|
136
|
+
if (facing != null && facing == CameraCharacteristics.LENS_FACING_BACK) {
|
|
137
|
+
StreamConfigurationMap map = characteristics.get(
|
|
138
|
+
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
|
|
139
|
+
if (map != null) {
|
|
140
|
+
previewSize = chooseOptimalSize(map.getOutputSizes(ImageFormat.YUV_420_888));
|
|
141
|
+
return cameraId;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
private Size chooseOptimalSize(Size[] choices) {
|
|
149
|
+
for (Size size : choices) {
|
|
150
|
+
if (size.getWidth() <= 1920 && size.getHeight() <= 1080) {
|
|
151
|
+
return size;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return choices[0];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
private void setupImageReader() {
|
|
158
|
+
imageReader = ImageReader.newInstance(previewSize.getWidth(), previewSize.getHeight(),
|
|
159
|
+
ImageFormat.YUV_420_888, 2);
|
|
160
|
+
imageReader.setOnImageAvailableListener(onImageAvailableListener, backgroundHandler);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
private final CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {
|
|
164
|
+
@Override
|
|
165
|
+
public void onOpened(@NonNull CameraDevice camera) {
|
|
166
|
+
cameraOpenCloseLock.release();
|
|
167
|
+
cameraDevice = camera;
|
|
168
|
+
createCameraPreviewSession();
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
@Override
|
|
172
|
+
public void onDisconnected(@NonNull CameraDevice camera) {
|
|
173
|
+
cameraOpenCloseLock.release();
|
|
174
|
+
camera.close();
|
|
175
|
+
cameraDevice = null;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
@Override
|
|
179
|
+
public void onError(@NonNull CameraDevice camera, int error) {
|
|
180
|
+
cameraOpenCloseLock.release();
|
|
181
|
+
camera.close();
|
|
182
|
+
cameraDevice = null;
|
|
183
|
+
scannerModule.onScanError("CAMERA_ERROR", "Camera error: " + error);
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
private void createCameraPreviewSession() {
|
|
188
|
+
try {
|
|
189
|
+
CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
|
|
190
|
+
builder.addTarget(imageReader.getSurface());
|
|
191
|
+
|
|
192
|
+
if (config.isEnableAutoFocus()) {
|
|
193
|
+
builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
cameraDevice.createCaptureSession(Arrays.asList(imageReader.getSurface()),
|
|
197
|
+
new CameraCaptureSession.StateCallback() {
|
|
198
|
+
@Override
|
|
199
|
+
public void onConfigured(@NonNull CameraCaptureSession session) {
|
|
200
|
+
if (cameraDevice == null) return;
|
|
201
|
+
|
|
202
|
+
captureSession = session;
|
|
203
|
+
try {
|
|
204
|
+
session.setRepeatingRequest(builder.build(), null, backgroundHandler);
|
|
205
|
+
isScanning = true;
|
|
206
|
+
scannerModule.onCameraReady();
|
|
207
|
+
} catch (CameraAccessException e) {
|
|
208
|
+
Log.e(TAG, "Error starting camera preview", e);
|
|
209
|
+
scannerModule.onScanError("CAMERA_ERROR", "Failed to start preview");
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
@Override
|
|
214
|
+
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
|
|
215
|
+
scannerModule.onScanError("CAMERA_ERROR", "Failed to configure camera");
|
|
216
|
+
}
|
|
217
|
+
}, null);
|
|
218
|
+
} catch (CameraAccessException e) {
|
|
219
|
+
Log.e(TAG, "Error creating camera preview session", e);
|
|
220
|
+
scannerModule.onScanError("CAMERA_ERROR", "Failed to create preview session");
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
private final ImageReader.OnImageAvailableListener onImageAvailableListener =
|
|
225
|
+
new ImageReader.OnImageAvailableListener() {
|
|
226
|
+
@Override
|
|
227
|
+
public void onImageAvailable(ImageReader reader) {
|
|
228
|
+
if (!isScanning) return;
|
|
229
|
+
|
|
230
|
+
Image image = reader.acquireLatestImage();
|
|
231
|
+
if (image != null) {
|
|
232
|
+
try {
|
|
233
|
+
processImage(image);
|
|
234
|
+
} finally {
|
|
235
|
+
image.close();
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
private void processImage(Image image) {
|
|
242
|
+
try {
|
|
243
|
+
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
|
|
244
|
+
byte[] data = new byte[buffer.remaining()];
|
|
245
|
+
buffer.get(data);
|
|
246
|
+
|
|
247
|
+
PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(
|
|
248
|
+
data, image.getWidth(), image.getHeight(), 0, 0,
|
|
249
|
+
image.getWidth(), image.getHeight(), false);
|
|
250
|
+
|
|
251
|
+
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
|
|
252
|
+
Result result = multiFormatReader.decode(bitmap);
|
|
253
|
+
|
|
254
|
+
if (result != null) {
|
|
255
|
+
scannerModule.onScanResult(result.getText(), result.getBarcodeFormat().toString());
|
|
256
|
+
}
|
|
257
|
+
} catch (Exception e) {
|
|
258
|
+
// No barcode found, continue scanning
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
private void closeCamera() {
|
|
263
|
+
try {
|
|
264
|
+
cameraOpenCloseLock.acquire();
|
|
265
|
+
if (captureSession != null) {
|
|
266
|
+
captureSession.close();
|
|
267
|
+
captureSession = null;
|
|
268
|
+
}
|
|
269
|
+
if (cameraDevice != null) {
|
|
270
|
+
cameraDevice.close();
|
|
271
|
+
cameraDevice = null;
|
|
272
|
+
}
|
|
273
|
+
if (imageReader != null) {
|
|
274
|
+
imageReader.close();
|
|
275
|
+
imageReader = null;
|
|
276
|
+
}
|
|
277
|
+
} catch (InterruptedException e) {
|
|
278
|
+
throw new RuntimeException("Interrupted while trying to lock camera closing.", e);
|
|
279
|
+
} finally {
|
|
280
|
+
cameraOpenCloseLock.release();
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
package com.pdf417scanner;
|
|
2
|
+
|
|
3
|
+
public class PDF417ScannerConfig {
|
|
4
|
+
private boolean enableAutoFocus = true;
|
|
5
|
+
private boolean enableTorch = false;
|
|
6
|
+
private int scanTimeout = 30000; // 30 seconds
|
|
7
|
+
private boolean enableBeep = true;
|
|
8
|
+
private boolean enableVibration = true;
|
|
9
|
+
|
|
10
|
+
public boolean isEnableAutoFocus() {
|
|
11
|
+
return enableAutoFocus;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public void setEnableAutoFocus(boolean enableAutoFocus) {
|
|
15
|
+
this.enableAutoFocus = enableAutoFocus;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public boolean isEnableTorch() {
|
|
19
|
+
return enableTorch;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public void setEnableTorch(boolean enableTorch) {
|
|
23
|
+
this.enableTorch = enableTorch;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public int getScanTimeout() {
|
|
27
|
+
return scanTimeout;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public void setScanTimeout(int scanTimeout) {
|
|
31
|
+
this.scanTimeout = scanTimeout;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public boolean isEnableBeep() {
|
|
35
|
+
return enableBeep;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public void setEnableBeep(boolean enableBeep) {
|
|
39
|
+
this.enableBeep = enableBeep;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public boolean isEnableVibration() {
|
|
43
|
+
return enableVibration;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public void setEnableVibration(boolean enableVibration) {
|
|
47
|
+
this.enableVibration = enableVibration;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
package com.pdf417scanner;
|
|
2
|
+
|
|
3
|
+
import android.Manifest;
|
|
4
|
+
import android.content.pm.PackageManager;
|
|
5
|
+
import android.os.Handler;
|
|
6
|
+
import android.os.Looper;
|
|
7
|
+
import android.util.Log;
|
|
8
|
+
|
|
9
|
+
import androidx.annotation.NonNull;
|
|
10
|
+
import androidx.core.app.ActivityCompat;
|
|
11
|
+
|
|
12
|
+
import com.facebook.react.bridge.Arguments;
|
|
13
|
+
import com.facebook.react.bridge.Promise;
|
|
14
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
15
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
|
16
|
+
import com.facebook.react.bridge.ReactMethod;
|
|
17
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
18
|
+
import com.facebook.react.bridge.WritableMap;
|
|
19
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
|
20
|
+
|
|
21
|
+
import java.util.HashMap;
|
|
22
|
+
import java.util.Map;
|
|
23
|
+
|
|
24
|
+
public class PDF417ScannerModule extends ReactContextBaseJavaModule {
|
|
25
|
+
private static final String TAG = "PDF417ScannerModule";
|
|
26
|
+
private static final String MODULE_NAME = "PDF417Scanner";
|
|
27
|
+
|
|
28
|
+
private PDF417CameraManager cameraManager;
|
|
29
|
+
private ReactApplicationContext reactContext;
|
|
30
|
+
private Handler mainHandler;
|
|
31
|
+
|
|
32
|
+
public PDF417ScannerModule(ReactApplicationContext reactContext) {
|
|
33
|
+
super(reactContext);
|
|
34
|
+
this.reactContext = reactContext;
|
|
35
|
+
this.mainHandler = new Handler(Looper.getMainLooper());
|
|
36
|
+
this.cameraManager = new PDF417CameraManager(reactContext, this);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@NonNull
|
|
40
|
+
@Override
|
|
41
|
+
public String getName() {
|
|
42
|
+
return MODULE_NAME;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@Override
|
|
46
|
+
public Map<String, Object> getConstants() {
|
|
47
|
+
final Map<String, Object> constants = new HashMap<>();
|
|
48
|
+
constants.put("SCAN_RESULT_EVENT", "PDF417ScanResult");
|
|
49
|
+
constants.put("SCAN_ERROR_EVENT", "PDF417ScanError");
|
|
50
|
+
constants.put("CAMERA_READY_EVENT", "PDF417CameraReady");
|
|
51
|
+
return constants;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
@ReactMethod
|
|
55
|
+
public void startScanning(ReadableMap config, Promise promise) {
|
|
56
|
+
try {
|
|
57
|
+
if (!hasRequiredPermissions()) {
|
|
58
|
+
promise.reject("PERMISSION_DENIED", "Camera permission is required");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
PDF417ScannerConfig scannerConfig = new PDF417ScannerConfig();
|
|
63
|
+
if (config.hasKey("enableAutoFocus")) {
|
|
64
|
+
scannerConfig.setEnableAutoFocus(config.getBoolean("enableAutoFocus"));
|
|
65
|
+
}
|
|
66
|
+
if (config.hasKey("enableTorch")) {
|
|
67
|
+
scannerConfig.setEnableTorch(config.getBoolean("enableTorch"));
|
|
68
|
+
}
|
|
69
|
+
if (config.hasKey("scanTimeout")) {
|
|
70
|
+
scannerConfig.setScanTimeout(config.getInt("scanTimeout"));
|
|
71
|
+
}
|
|
72
|
+
if (config.hasKey("enableBeep")) {
|
|
73
|
+
scannerConfig.setEnableBeep(config.getBoolean("enableBeep"));
|
|
74
|
+
}
|
|
75
|
+
if (config.hasKey("enableVibration")) {
|
|
76
|
+
scannerConfig.setEnableVibration(config.getBoolean("enableVibration"));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
cameraManager.startScanning(scannerConfig);
|
|
80
|
+
promise.resolve(null);
|
|
81
|
+
} catch (Exception e) {
|
|
82
|
+
Log.e(TAG, "Error starting scanner", e);
|
|
83
|
+
promise.reject("START_SCANNING_ERROR", e.getMessage());
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@ReactMethod
|
|
88
|
+
public void stopScanning(Promise promise) {
|
|
89
|
+
try {
|
|
90
|
+
cameraManager.stopScanning();
|
|
91
|
+
promise.resolve(null);
|
|
92
|
+
} catch (Exception e) {
|
|
93
|
+
Log.e(TAG, "Error stopping scanner", e);
|
|
94
|
+
promise.reject("STOP_SCANNING_ERROR", e.getMessage());
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
@ReactMethod
|
|
99
|
+
public void setTorchEnabled(boolean enabled, Promise promise) {
|
|
100
|
+
try {
|
|
101
|
+
cameraManager.setTorchEnabled(enabled);
|
|
102
|
+
promise.resolve(null);
|
|
103
|
+
} catch (Exception e) {
|
|
104
|
+
Log.e(TAG, "Error setting torch", e);
|
|
105
|
+
promise.reject("TORCH_ERROR", e.getMessage());
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
private boolean hasRequiredPermissions() {
|
|
110
|
+
return ActivityCompat.checkSelfPermission(reactContext, Manifest.permission.CAMERA)
|
|
111
|
+
== PackageManager.PERMISSION_GRANTED;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
public void sendEvent(String eventName, WritableMap params) {
|
|
115
|
+
reactContext
|
|
116
|
+
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
|
|
117
|
+
.emit(eventName, params);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
public void onScanResult(String data, String format) {
|
|
121
|
+
WritableMap result = Arguments.createMap();
|
|
122
|
+
result.putString("data", data);
|
|
123
|
+
result.putString("format", format);
|
|
124
|
+
result.putDouble("timestamp", System.currentTimeMillis());
|
|
125
|
+
sendEvent("PDF417ScanResult", result);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
public void onScanError(String code, String message) {
|
|
129
|
+
WritableMap error = Arguments.createMap();
|
|
130
|
+
error.putString("code", code);
|
|
131
|
+
error.putString("message", message);
|
|
132
|
+
sendEvent("PDF417ScanError", error);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
public void onCameraReady() {
|
|
136
|
+
sendEvent("PDF417CameraReady", null);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
package com.pdf417scanner;
|
|
2
|
+
|
|
3
|
+
import androidx.annotation.NonNull;
|
|
4
|
+
|
|
5
|
+
import com.facebook.react.ReactPackage;
|
|
6
|
+
import com.facebook.react.bridge.NativeModule;
|
|
7
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
8
|
+
import com.facebook.react.uimanager.ViewManager;
|
|
9
|
+
|
|
10
|
+
import java.util.ArrayList;
|
|
11
|
+
import java.util.Collections;
|
|
12
|
+
import java.util.List;
|
|
13
|
+
|
|
14
|
+
public class PDF417ScannerPackage implements ReactPackage {
|
|
15
|
+
@NonNull
|
|
16
|
+
@Override
|
|
17
|
+
public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {
|
|
18
|
+
List<NativeModule> modules = new ArrayList<>();
|
|
19
|
+
modules.add(new PDF417ScannerModule(reactContext));
|
|
20
|
+
return modules;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@NonNull
|
|
24
|
+
@Override
|
|
25
|
+
public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext reactContext) {
|
|
26
|
+
return Collections.emptyList();
|
|
27
|
+
}
|
|
28
|
+
}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export interface PDF417ScanResult {
|
|
2
|
+
data: string;
|
|
3
|
+
format: string;
|
|
4
|
+
timestamp: number;
|
|
5
|
+
}
|
|
6
|
+
export interface PDF417ScanError {
|
|
7
|
+
code: string;
|
|
8
|
+
message: string;
|
|
9
|
+
}
|
|
10
|
+
export interface PDF417ScannerConfig {
|
|
11
|
+
enableAutoFocus?: boolean;
|
|
12
|
+
enableTorch?: boolean;
|
|
13
|
+
scanTimeout?: number;
|
|
14
|
+
enableBeep?: boolean;
|
|
15
|
+
enableVibration?: boolean;
|
|
16
|
+
}
|
|
17
|
+
declare class PDF417ScannerModule {
|
|
18
|
+
private eventEmitter;
|
|
19
|
+
private isScanning;
|
|
20
|
+
constructor();
|
|
21
|
+
/**
|
|
22
|
+
* Request camera permission
|
|
23
|
+
*/
|
|
24
|
+
requestCameraPermission(): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* Check if camera permission is granted
|
|
27
|
+
*/
|
|
28
|
+
hasCameraPermission(): Promise<boolean>;
|
|
29
|
+
/**
|
|
30
|
+
* Start PDF417 scanning
|
|
31
|
+
*/
|
|
32
|
+
startScanning(config?: PDF417ScannerConfig): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Stop PDF417 scanning
|
|
35
|
+
*/
|
|
36
|
+
stopScanning(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Check if scanner is currently running
|
|
39
|
+
*/
|
|
40
|
+
isCurrentlyScanning(): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Enable/disable torch (flashlight)
|
|
43
|
+
*/
|
|
44
|
+
setTorchEnabled(enabled: boolean): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Listen for scan results
|
|
47
|
+
*/
|
|
48
|
+
onScanResult(callback: (result: PDF417ScanResult) => void): () => void;
|
|
49
|
+
/**
|
|
50
|
+
* Listen for scan errors
|
|
51
|
+
*/
|
|
52
|
+
onScanError(callback: (error: PDF417ScanError) => void): () => void;
|
|
53
|
+
/**
|
|
54
|
+
* Listen for camera ready event
|
|
55
|
+
*/
|
|
56
|
+
onCameraReady(callback: () => void): () => void;
|
|
57
|
+
}
|
|
58
|
+
declare const _default: PDF417ScannerModule;
|
|
59
|
+
export default _default;
|
|
60
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,cAAM,mBAAmB;IACvB,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,UAAU,CAAkB;;IAMpC;;OAEG;IACG,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC;IAuBjD;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAgB7C;;OAEG;IACG,aAAa,CAAC,MAAM,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBpE;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAanC;;OAEG;IACH,mBAAmB,IAAI,OAAO;IAI9B;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtD;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI;IAKtE;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAKnE;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;CAIhD;;AAED,wBAAyC"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const react_native_1 = require("react-native");
|
|
4
|
+
const { PDF417Scanner } = react_native_1.NativeModules;
|
|
5
|
+
class PDF417ScannerModule {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.isScanning = false;
|
|
8
|
+
this.eventEmitter = new react_native_1.NativeEventEmitter(PDF417Scanner);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Request camera permission
|
|
12
|
+
*/
|
|
13
|
+
async requestCameraPermission() {
|
|
14
|
+
if (react_native_1.Platform.OS !== 'android') {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const granted = await react_native_1.PermissionsAndroid.request(react_native_1.PermissionsAndroid.PERMISSIONS.CAMERA, {
|
|
19
|
+
title: 'Camera Permission',
|
|
20
|
+
message: 'This app needs camera access to scan PDF417 barcodes',
|
|
21
|
+
buttonNeutral: 'Ask Me Later',
|
|
22
|
+
buttonNegative: 'Cancel',
|
|
23
|
+
buttonPositive: 'OK',
|
|
24
|
+
});
|
|
25
|
+
return granted === react_native_1.PermissionsAndroid.RESULTS.GRANTED;
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
console.warn('Camera permission error:', err);
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if camera permission is granted
|
|
34
|
+
*/
|
|
35
|
+
async hasCameraPermission() {
|
|
36
|
+
if (react_native_1.Platform.OS !== 'android') {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const hasPermission = await react_native_1.PermissionsAndroid.check(react_native_1.PermissionsAndroid.PERMISSIONS.CAMERA);
|
|
41
|
+
return hasPermission;
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
console.warn('Permission check error:', err);
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Start PDF417 scanning
|
|
50
|
+
*/
|
|
51
|
+
async startScanning(config = {}) {
|
|
52
|
+
if (this.isScanning) {
|
|
53
|
+
throw new Error('Scanner is already running');
|
|
54
|
+
}
|
|
55
|
+
const hasPermission = await this.hasCameraPermission();
|
|
56
|
+
if (!hasPermission) {
|
|
57
|
+
const granted = await this.requestCameraPermission();
|
|
58
|
+
if (!granted) {
|
|
59
|
+
throw new Error('Camera permission denied');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
await PDF417Scanner.startScanning(config);
|
|
64
|
+
this.isScanning = true;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
throw new Error(`Failed to start scanning: ${error}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Stop PDF417 scanning
|
|
72
|
+
*/
|
|
73
|
+
async stopScanning() {
|
|
74
|
+
if (!this.isScanning) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
await PDF417Scanner.stopScanning();
|
|
79
|
+
this.isScanning = false;
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
throw new Error(`Failed to stop scanning: ${error}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if scanner is currently running
|
|
87
|
+
*/
|
|
88
|
+
isCurrentlyScanning() {
|
|
89
|
+
return this.isScanning;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Enable/disable torch (flashlight)
|
|
93
|
+
*/
|
|
94
|
+
async setTorchEnabled(enabled) {
|
|
95
|
+
try {
|
|
96
|
+
await PDF417Scanner.setTorchEnabled(enabled);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
throw new Error(`Failed to set torch: ${error}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Listen for scan results
|
|
104
|
+
*/
|
|
105
|
+
onScanResult(callback) {
|
|
106
|
+
const subscription = this.eventEmitter.addListener('PDF417ScanResult', callback);
|
|
107
|
+
return () => subscription.remove();
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Listen for scan errors
|
|
111
|
+
*/
|
|
112
|
+
onScanError(callback) {
|
|
113
|
+
const subscription = this.eventEmitter.addListener('PDF417ScanError', callback);
|
|
114
|
+
return () => subscription.remove();
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Listen for camera ready event
|
|
118
|
+
*/
|
|
119
|
+
onCameraReady(callback) {
|
|
120
|
+
const subscription = this.eventEmitter.addListener('PDF417CameraReady', callback);
|
|
121
|
+
return () => subscription.remove();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.default = new PDF417ScannerModule();
|
|
125
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|