Skip to content

Commit 3e4bf6b

Browse files
committed
Barcode type added
1 parent c01d247 commit 3e4bf6b

File tree

6 files changed

+100
-145
lines changed

6 files changed

+100
-145
lines changed

android/src/main/java/com/reactnativemlkitbarcode/MlKitBarcodeDecoder.java

Lines changed: 19 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,26 @@
11
package com.reactnativemlkitbarcode;
22

33
import android.annotation.SuppressLint;
4-
import android.graphics.Color;
54
import android.media.Image;
65
import android.os.Handler;
76
import android.os.Looper;
87
import android.util.DisplayMetrics;
98
import android.util.Log;
10-
import android.util.Size;
11-
import android.view.Gravity;
12-
import android.view.ViewGroup;
13-
import android.widget.LinearLayout;
149

1510
import androidx.annotation.NonNull;
16-
import androidx.appcompat.app.AppCompatActivity;
1711
import androidx.camera.core.AspectRatio;
18-
import androidx.camera.core.CameraFilter;
1912
import androidx.camera.core.CameraSelector;
2013
import androidx.camera.core.ImageAnalysis;
2114
import androidx.camera.core.ImageProxy;
2215
import androidx.camera.core.Preview;
2316
import androidx.camera.lifecycle.ProcessCameraProvider;
2417
import androidx.camera.view.PreviewView;
2518
import androidx.fragment.app.Fragment;
26-
import androidx.fragment.app.FragmentActivity;
27-
import androidx.lifecycle.LifecycleOwner;
2819

29-
import com.facebook.react.bridge.Callback;
3020
import com.facebook.react.bridge.ReactContext;
3121
import com.facebook.react.bridge.WritableMap;
3222
import com.facebook.react.bridge.WritableNativeMap;
3323
import com.facebook.react.modules.core.DeviceEventManagerModule;
34-
import com.facebook.react.uimanager.events.RCTEventEmitter;
3524
import com.google.android.gms.tasks.OnCanceledListener;
3625
import com.google.android.gms.tasks.OnCompleteListener;
3726
import com.google.android.gms.tasks.OnFailureListener;
@@ -53,8 +42,9 @@ public class MlKitBarcodeDecoder implements ImageAnalysis.Analyzer{
5342

5443
private final double RATIO_4_3_VALUE = 4.0 / 3.0;
5544
private final double RATIO_16_9_VALUE = 16.0 / 9.0;
45+
5646
private Fragment frag;
57-
private PreviewView previewView;
47+
private PreviewView previewView = null;
5848
private BarcodeScanner scanner;
5949
private ProcessCameraProvider cameraProvider;
6050
private ImageAnalysis imageAnalysis;
@@ -63,29 +53,23 @@ public class MlKitBarcodeDecoder implements ImageAnalysis.Analyzer{
6353

6454
private ReactContext reactContext;
6555

56+
private int barcodeFormat = 0; // All
57+
6658
public MlKitBarcodeDecoder(Fragment frag, ReactContext reactContext){
6759
this.frag = frag;
6860
this.reactContext = reactContext;
6961
}
7062

71-
public PreviewView createScannerView(int width, int height){
72-
previewView = new PreviewView(frag.getActivity());
73-
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
74-
layoutParams.weight = width;
75-
layoutParams.height = height;
76-
layoutParams.gravity = Gravity.CENTER;
77-
previewView.setLayoutParams(layoutParams);
78-
previewView.setBackgroundColor(Color.RED);
79-
return previewView;
63+
public PreviewView createScannerView(){
64+
this.previewView = new PreviewView(frag.getActivity());
65+
return this.previewView;
8066
}
8167

82-
public void updateSize(int width, int height){
83-
// Log.e(TAG, "updateSize: W:"+width+" H:"+height);
84-
previewView.getLayoutParams().width = width;
85-
previewView.getLayoutParams().height = height;
68+
public void setBarCodeFormat(int barcodeFormat){
69+
Log.e(TAG, "setBarCodeFormat: "+barcodeFormat);
70+
this.barcodeFormat = barcodeFormat;
8671
}
8772

88-
8973
/////////////////
9074
protected void startCamera() {
9175
createBarCodeScanner();
@@ -109,8 +93,8 @@ protected void startCamera() {
10993
cameraProvider = processCameraProvider.get();
11094

11195
cameraProvider.unbindAll();
112-
cameraProvider.bindToLifecycle(frag.getActivity(), cameraSelector, preview,imageAnalysis);
113-
preview.setSurfaceProvider(previewView.getSurfaceProvider());
96+
cameraProvider.bindToLifecycle(frag.getActivity(), cameraSelector, preview, imageAnalysis);
97+
preview.setSurfaceProvider(this.previewView.getSurfaceProvider());
11498

11599
} catch (ExecutionException e) {
116100
Log.e(TAG, "startCamera: ExecutionException :"+e.toString());
@@ -134,20 +118,18 @@ protected void stopAll(){
134118
cameraProvider.unbindAll();
135119
cameraProvider.shutdown();
136120
}
137-
138-
// Log.e(TAG, "stopAll:....");
139121
}
140122

141123
private Preview getPreview() {
142124
return new Preview.Builder()
143125
.setTargetAspectRatio(aspectRatio())
144-
.setTargetRotation(previewView.getDisplay().getRotation())
126+
.setTargetRotation(this.previewView.getDisplay().getRotation())
145127
.build();
146128
}
147129

148130
private int aspectRatio() {
149131
DisplayMetrics displayMetrics = new DisplayMetrics();
150-
previewView.getDisplay().getRealMetrics(displayMetrics);
132+
this.previewView.getDisplay().getRealMetrics(displayMetrics);
151133
double previewRatio = (double) Math.max(displayMetrics.widthPixels, displayMetrics.heightPixels) / Math.min(displayMetrics.widthPixels, displayMetrics.heightPixels);
152134
if (Math.abs(previewRatio - RATIO_4_3_VALUE) <= Math.abs(previewRatio - RATIO_16_9_VALUE)) {
153135
return AspectRatio.RATIO_4_3;
@@ -156,10 +138,10 @@ private int aspectRatio() {
156138
}
157139

158140
private void createBarCodeScanner(){
141+
Log.e(TAG, "createBarCodeScanner: BarCode Format :"+barcodeFormat);
159142
BarcodeScannerOptions options =
160143
new BarcodeScannerOptions.Builder()
161-
.setBarcodeFormats(
162-
Barcode.FORMAT_ALL_FORMATS)
144+
.setBarcodeFormats(barcodeFormat)
163145
.build();
164146
scanner = BarcodeScanning.getClient(options);
165147
}
@@ -168,16 +150,13 @@ private void createBarCodeScanner(){
168150
@SuppressLint("UnsafeOptInUsageError")
169151
@Override
170152
public void analyze(@NonNull ImageProxy imageProxy) {
171-
// Log.e(TAG, "analyze: ImageProxy:"+imageProxy.getImageInfo().getTimestamp());
172153
Image mediaImage = imageProxy.getImage();
173154
if (mediaImage != null) {
174155
InputImage image = InputImage.fromMediaImage(mediaImage, imageProxy.getImageInfo().getRotationDegrees());
175156
scanner.process(image).addOnSuccessListener(new OnSuccessListener<List<Barcode>>() {
176157
@Override
177158
public void onSuccess(List<Barcode> barcodes) {
178159
if(barcodes.size() > 0){
179-
// Log.e(TAG, "analyze: ImageProxy: H: "+imageProxy.getImage().getHeight()+" W :"+imageProxy.getImage().getWidth());
180-
// Log.e(TAG, "onSuccess: BarCodes :"+barcodes.size());
181160
String rawValue = barcodes.get(barcodes.size()-1).getRawValue();
182161
Log.e(TAG, "onSuccess: RawValue :"+rawValue);
183162
sendEvent(rawValue);
@@ -196,7 +175,9 @@ public void onFailure(@NonNull Exception e) {
196175
@Override
197176
public void onCanceled() {
198177
Log.e(TAG, "onCanceled: ....");
199-
178+
if(mediaImage!=null)
179+
mediaImage.close();
180+
imageProxy.close();
200181
}
201182
})
202183
.addOnCompleteListener(new OnCompleteListener<List<Barcode>>() {

android/src/main/java/com/reactnativemlkitbarcode/MlKitBarcodeFragment.java

Lines changed: 8 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,12 @@ public class MlKitBarcodeFragment extends Fragment {
2020

2121
private MlKitBarcodeDecoder mlKitBarcodeDecoder = null;
2222
private ReactContext reactContext;
23-
private int width;
24-
private int height;
23+
private int barcodeFormat;
2524

26-
public MlKitBarcodeFragment(int width, int height, ThemedReactContext reactContext) {
25+
26+
public MlKitBarcodeFragment(ThemedReactContext reactContext, int barcodeFormat) {
2727
this.reactContext = reactContext;
28-
this.width = width;
29-
this.height = height;
28+
this.barcodeFormat = barcodeFormat;
3029
}
3130

3231
public MlKitBarcodeDecoder getScannerView(){
@@ -40,7 +39,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c
4039
mlKitBarcodeDecoder = new MlKitBarcodeDecoder(this, reactContext);
4140
RelativeLayout relativeLayout = new RelativeLayout(MlKitBarcodeFragment.this.getContext());
4241
relativeLayout.setGravity(Gravity.CENTER);
43-
relativeLayout.addView(mlKitBarcodeDecoder.createScannerView(width,height));
42+
relativeLayout.addView(mlKitBarcodeDecoder.createScannerView());
4443

4544
return relativeLayout;
4645
// return null;
@@ -49,34 +48,10 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c
4948
@Override
5049
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
5150
super.onViewCreated(view, savedInstanceState);
52-
mlKitBarcodeDecoder.startCamera();
53-
// Log.e(TAG, "onViewCreated: ");
54-
}
55-
56-
@Override
57-
public void onPause() {
58-
super.onPause();
59-
// Log.e(TAG, "onPause: ");
60-
}
61-
62-
@Override
63-
public void onStop() {
64-
super.onStop();
65-
// Log.e(TAG, "onStop: ");
66-
}
67-
68-
@Override
69-
public void onDetach() {
70-
super.onDetach();
71-
// Log.e(TAG, "onDetach: ");
72-
}
51+
Log.e(TAG, "onViewCreated: ");
52+
mlKitBarcodeDecoder.setBarCodeFormat(barcodeFormat);
53+
mlKitBarcodeDecoder.startCamera();
7354

74-
@Override
75-
public void onDestroy() {
76-
super.onDestroy();
77-
// Log.e(TAG, "onDestroy: ....");
78-
// if(scannerView != null)
79-
// scannerView.stopAll();
8055
}
8156

8257
}

android/src/main/java/com/reactnativemlkitbarcode/MlkitBarcodeViewManager.java

Lines changed: 7 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.reactnativemlkitbarcode;
22

3-
import android.os.Handler;
43
import android.util.DisplayMetrics;
54
import android.util.Log;
65
import android.view.Choreographer;
@@ -29,10 +28,7 @@ public class MlkitBarcodeViewManager extends ViewGroupManager<FrameLayout> {
2928
private MlKitBarcodeFragment scannerFrag;
3029
private ThemedReactContext reactContext;
3130

32-
private int WIDTH = 0;
33-
private int HEIGHT = 0;
34-
35-
private MlKitBarcodeDecoder mlKitBarcodeDecoder;
31+
private int barcodeFormat = 0;
3632

3733
@Override
3834
@NonNull
@@ -42,63 +38,20 @@ public String getName() {
4238

4339
public MlkitBarcodeViewManager() {
4440
super();
45-
// Log.e(TAG, "MlkitBarcodeViewManager: Construct....");
4641
}
4742

4843
@Override
4944
@NonNull
5045
public FrameLayout createViewInstance(ThemedReactContext reactContext) {
5146
this.reactContext = reactContext;
52-
// previewView = new PreviewView(reactContext.getCurrentActivity());
53-
// LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
54-
// layoutParams.weight = 300;
55-
// layoutParams.height = 200;
56-
// previewView.setLayoutParams(layoutParams);
57-
// Log.e(TAG, "createViewInstance: View instance Created...");
58-
// startCamera();
59-
60-
// scannerView = new ScannerView(reactContext);
61-
// this.startScanner();
62-
// return scannerView.createScannerView(100,200);
63-
6447
FrameLayout frameLayout = new FrameLayout(reactContext);
6548
return frameLayout;
6649
}
6750

68-
@ReactProp(name = "width")
69-
public void setWidth(View view, int width) {
70-
// Log.e(TAG, "setWidth: " + width);
71-
// view.getLayoutParams().width = width;
72-
WIDTH = width;
73-
if(scannerFrag != null && scannerFrag.getScannerView() != null)
74-
scannerFrag.getScannerView().updateSize(WIDTH,HEIGHT);
75-
}
76-
77-
@ReactProp(name = "height")
78-
public void setHeight(View view, int height) {
79-
// Log.e(TAG, "setHeight: " + height);
80-
// view.getLayoutParams().height = height;
81-
HEIGHT = height;
82-
if(scannerFrag != null && scannerFrag.getScannerView() != null)
83-
scannerFrag.getScannerView().updateSize(WIDTH,HEIGHT);
84-
}
85-
86-
private void startScanner(){
87-
Handler handler = new Handler();
88-
handler.postDelayed(new Runnable() {
89-
@Override
90-
public void run() {
91-
mlKitBarcodeDecoder.startCamera();
92-
}
93-
},1200);
94-
}
95-
9651
@Override
9752
public void receiveCommand(@NonNull FrameLayout root, String commandId, @Nullable ReadableArray args) {
9853
super.receiveCommand(root, commandId, args);
9954
int reactNativeViewId = args.getInt(0);
100-
101-
// Log.e(TAG, "receiveCommand: "+commandId);
10255
switch (commandId) {
10356
case COMMAND_CREATE:{
10457
createFragment(root, reactNativeViewId);
@@ -111,14 +64,17 @@ public void receiveCommand(@NonNull FrameLayout root, String commandId, @Nullabl
11164
}
11265
}
11366

67+
@ReactProp(name="barcodeFormat")
68+
public void setBarcodeFormat( View view,int barcodeFormat){
69+
// Log.e(TAG, "setBarcodeFormat: "+ barcodeFormat);
70+
this.barcodeFormat = barcodeFormat;
71+
}
11472

11573

11674
public void createFragment(FrameLayout root, int reactNativeViewId) {
117-
// Log.e(TAG, "createFragment: ..."+reactNativeViewId+" rootID:"+root.getId());
11875
ViewGroup parentView = (ViewGroup) root.findViewById(reactNativeViewId);
11976
this.setupLayout(parentView);
120-
this.scannerFrag = new MlKitBarcodeFragment(WIDTH,HEIGHT,reactContext);
121-
// Log.e(TAG, "Fragment Transaction... ");
77+
this.scannerFrag = new MlKitBarcodeFragment(reactContext, barcodeFormat);
12278
FragmentActivity activity = (FragmentActivity) this.reactContext.getCurrentActivity();
12379
activity.getSupportFragmentManager()
12480
.beginTransaction()
@@ -130,11 +86,9 @@ public void removeFragment(){
13086
try {
13187
if(scannerFrag != null && scannerFrag.getScannerView() != null)
13288
scannerFrag.getScannerView().stopAll();
133-
13489
Choreographer.getInstance().removeFrameCallback(this.frameCallback);
13590
FragmentActivity activity = (FragmentActivity) this.reactContext.getCurrentActivity();
13691
activity.getSupportFragmentManager().beginTransaction().remove(this.scannerFrag).commit();
137-
// Log.e(TAG, "Fragment removed...");
13892
}
13993
catch (Exception e){
14094
Log.e(TAG, "removeFragment: Error :"+e.toString());
@@ -146,7 +100,6 @@ public void setupLayout(View view) {
146100
this.frameCallback = new Choreographer.FrameCallback() {
147101
@Override
148102
public void doFrame(long frameTimeNanos) {
149-
// Log.e(TAG, "doFrame: "+frameTimeNanos);
150103
manuallyLayoutChildren(view);
151104
view.getViewTreeObserver().dispatchOnGlobalLayout();
152105
Choreographer.getInstance().postFrameCallback(this);
@@ -162,7 +115,6 @@ public void doFrame(long frameTimeNanos) {
162115

163116
public void manuallyLayoutChildren(View view) {
164117
try{
165-
// Log.e(TAG, "manuallyLayoutChildren:... ");
166118
DisplayMetrics displayMetrics = new DisplayMetrics();
167119
WindowManager windowManager = this.reactContext.getCurrentActivity().getWindowManager();
168120
windowManager.getDefaultDisplay().getMetrics(displayMetrics);

example/src/App.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,28 @@
11
import * as React from 'react';
22

33
import { StyleSheet, TouchableOpacity, View, Text, SafeAreaView } from 'react-native';
4-
import { MlkitBarcodeView } from 'react-native-mlkit-barcode';
4+
import { MlkitBarcodeView, BARCODE } from 'react-native-mlkit-barcode';
5+
56

67
export default class App extends React.Component {
78

89
constructor(props) {
910
super(props)
1011
this.state = {
11-
enableQrScanner: false,
12+
enableQrScanner: true,
13+
barcodeFormat:BARCODE.FORMAT_ALL_FORMATS,
1214
}
1315
}
1416

17+
componentDidMount(){
18+
}
19+
1520
render() {
1621
return (
1722
<SafeAreaView style={{flex:1}}>
1823
<MlkitBarcodeView
1924
enableQrScanner={this.state.enableQrScanner}
20-
style={{
21-
width: 900,
22-
height: 900,
23-
}}
25+
barcodeFormat={BARCODE.FORMAT_ALL_FORMATS}
2426
onSuccess={(data) => {
2527
console.log("App BarCode On Success :", data);
2628
this.setState({enableQrScanner:false})

0 commit comments

Comments
 (0)