Skip to content
This repository was archived by the owner on Apr 4, 2023. It is now read-only.

Commit a18ec61

Browse files
Barcode scanner crashes with onFailureListener error on Android #1321
1 parent d5fcb3b commit a18ec61

File tree

1 file changed

+96
-91
lines changed

1 file changed

+96
-91
lines changed

src/mlkit/mlkit-cameraview.android.ts

Lines changed: 96 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -117,119 +117,124 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase {
117117
if (!this.surfaceView) {
118118
return;
119119
}
120-
const surfaceHolder = this.surfaceView.getHolder();
121-
const cameraFacingRequested = this.preferFrontCamera ? android.hardware.Camera.CameraInfo.CAMERA_FACING_FRONT : android.hardware.Camera.CameraInfo.CAMERA_FACING_BACK;
122-
const cameraInfo = new android.hardware.Camera.CameraInfo();
123-
124-
let requestedCameraId = android.hardware.Camera.CameraInfo.CAMERA_FACING_BACK; // use this as the default
125-
for (let i = 0; i < android.hardware.Camera.getNumberOfCameras(); ++i) {
126-
android.hardware.Camera.getCameraInfo(i, cameraInfo);
127-
if (cameraInfo.facing === cameraFacingRequested) {
128-
requestedCameraId = i;
129-
break;
120+
try {
121+
122+
const surfaceHolder = this.surfaceView.getHolder();
123+
const cameraFacingRequested = this.preferFrontCamera ? android.hardware.Camera.CameraInfo.CAMERA_FACING_FRONT : android.hardware.Camera.CameraInfo.CAMERA_FACING_BACK;
124+
const cameraInfo = new android.hardware.Camera.CameraInfo();
125+
126+
let requestedCameraId = android.hardware.Camera.CameraInfo.CAMERA_FACING_BACK; // use this as the default
127+
for (let i = 0; i < android.hardware.Camera.getNumberOfCameras(); ++i) {
128+
android.hardware.Camera.getCameraInfo(i, cameraInfo);
129+
if (cameraInfo.facing === cameraFacingRequested) {
130+
requestedCameraId = i;
131+
break;
132+
}
130133
}
131-
}
132-
this.camera = android.hardware.Camera.open(requestedCameraId);
134+
this.camera = android.hardware.Camera.open(requestedCameraId);
133135

134-
let sizePair = this.selectSizePair(this.camera, 1400, 1200); // TODO based on wrapping frame
136+
let sizePair = this.selectSizePair(this.camera, 1400, 1200); // TODO based on wrapping frame
135137

136-
if (!sizePair) {
137-
console.log("Could not find suitable preview size.");
138-
return;
139-
}
138+
if (!sizePair) {
139+
console.log("Could not find suitable preview size.");
140+
return;
141+
}
140142

141-
const pictureSize = sizePair.pictureSize;
142-
const previewSize = sizePair.previewSize;
143+
const pictureSize = sizePair.pictureSize;
144+
const previewSize = sizePair.previewSize;
143145

144-
console.log("sizePair.pictureSize: " + pictureSize.width + "x" + pictureSize.height);
145-
console.log("sizePair.previewSize: " + previewSize.width + "x" + previewSize.height);
146+
console.log("sizePair.pictureSize: " + pictureSize.width + "x" + pictureSize.height);
147+
console.log("sizePair.previewSize: " + previewSize.width + "x" + previewSize.height);
146148

147-
const parameters = this.camera.getParameters();
149+
const parameters = this.camera.getParameters();
148150

149-
if (pictureSize) {
150-
parameters.setPictureSize(pictureSize.width, pictureSize.height);
151-
}
152-
parameters.setPreviewSize(previewSize.width, previewSize.height);
153-
parameters.setPreviewFormat(android.graphics.ImageFormat.NV21);
151+
if (pictureSize) {
152+
parameters.setPictureSize(pictureSize.width, pictureSize.height);
153+
}
154+
parameters.setPreviewSize(previewSize.width, previewSize.height);
155+
parameters.setPreviewFormat(android.graphics.ImageFormat.NV21);
154156

155-
this.setRotation(this.camera, parameters, requestedCameraId);
157+
this.setRotation(this.camera, parameters, requestedCameraId);
156158

157-
if (parameters.getSupportedFocusModes().contains(android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
158-
parameters.setFocusMode(android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
159-
}
159+
if (parameters.getSupportedFocusModes().contains(android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
160+
parameters.setFocusMode(android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
161+
}
160162

161-
if (this.torchOn) {
162-
if (parameters.getSupportedFlashModes() && parameters.getSupportedFlashModes().contains(android.hardware.Camera.Parameters.FLASH_MODE_TORCH)) {
163-
parameters.setFlashMode(android.hardware.Camera.Parameters.FLASH_MODE_TORCH);
163+
if (this.torchOn) {
164+
if (parameters.getSupportedFlashModes() && parameters.getSupportedFlashModes().contains(android.hardware.Camera.Parameters.FLASH_MODE_TORCH)) {
165+
parameters.setFlashMode(android.hardware.Camera.Parameters.FLASH_MODE_TORCH);
166+
}
164167
}
165-
}
166168

167-
this.camera.setParameters(parameters);
169+
this.camera.setParameters(parameters);
168170

169-
this.detector = this.createDetector();
170-
const onSuccessListener = this.createSuccessListener();
171-
const onFailureListener = this.createFailureListener();
172-
173-
let metadata =
174-
new com.google.firebase.ml.vision.common.FirebaseVisionImageMetadata.Builder()
175-
.setFormat(com.google.firebase.ml.vision.common.FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
176-
.setWidth(previewSize.width)
177-
.setHeight(previewSize.height)
178-
.setRotation(this.rotation)
179-
.build();
180-
181-
let throttle = 0;
182-
this.camera.setPreviewCallbackWithBuffer(new android.hardware.Camera.PreviewCallback({
183-
onPreviewFrame: (byteArray, camera) => {
184-
185-
if (this.pendingFrameData !== null) {
186-
camera.addCallbackBuffer(this.pendingFrameData.array());
187-
this.pendingFrameData = null;
188-
}
171+
this.detector = this.createDetector();
172+
const onSuccessListener = this.createSuccessListener();
173+
const onFailureListener = this.createFailureListener();
189174

190-
if (!this.bytesToByteBuffer.has(byteArray)) {
191-
console.log("Skipping frame");
192-
return;
193-
}
175+
let metadata =
176+
new com.google.firebase.ml.vision.common.FirebaseVisionImageMetadata.Builder()
177+
.setFormat(com.google.firebase.ml.vision.common.FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
178+
.setWidth(previewSize.width)
179+
.setHeight(previewSize.height)
180+
.setRotation(this.rotation)
181+
.build();
194182

195-
this.pendingFrameData = this.bytesToByteBuffer.get(byteArray);
183+
let throttle = 0;
184+
this.camera.setPreviewCallbackWithBuffer(new android.hardware.Camera.PreviewCallback({
185+
onPreviewFrame: (byteArray, camera) => {
196186

197-
if (throttle++ % this.processEveryNthFrame !== 0) {
198-
return;
199-
}
187+
if (this.pendingFrameData !== null) {
188+
camera.addCallbackBuffer(this.pendingFrameData.array());
189+
this.pendingFrameData = null;
190+
}
191+
192+
if (!this.bytesToByteBuffer.has(byteArray)) {
193+
console.log("Skipping frame");
194+
return;
195+
}
196+
197+
this.pendingFrameData = this.bytesToByteBuffer.get(byteArray);
200198

201-
let data = this.pendingFrameData;
202-
// pendingFrameData = null;
203-
204-
if (this.detector.processImage) {
205-
this.lastVisionImage = com.google.firebase.ml.vision.common.FirebaseVisionImage.fromByteBuffer(data, metadata);
206-
this.detector
207-
.processImage(this.lastVisionImage)
208-
.addOnSuccessListener(onSuccessListener)
209-
.addOnFailureListener(onFailureListener);
210-
} else if (this.detector.detectInImage) {
211-
this.lastVisionImage = com.google.firebase.ml.vision.common.FirebaseVisionImage.fromByteBuffer(data, metadata);
212-
this.detector
213-
.detectInImage(this.lastVisionImage)
214-
.addOnSuccessListener(onSuccessListener)
215-
.addOnFailureListener(onFailureListener);
216-
} else {
217-
this.runDetector(data, previewSize.width, previewSize.height);
199+
if (throttle++ % this.processEveryNthFrame !== 0) {
200+
return;
201+
}
202+
203+
let data = this.pendingFrameData;
204+
// pendingFrameData = null;
205+
206+
if (this.detector.processImage) {
207+
this.lastVisionImage = com.google.firebase.ml.vision.common.FirebaseVisionImage.fromByteBuffer(data, metadata);
208+
this.detector
209+
.processImage(this.lastVisionImage)
210+
.addOnSuccessListener(onSuccessListener)
211+
.addOnFailureListener(onFailureListener);
212+
} else if (this.detector.detectInImage) {
213+
this.lastVisionImage = com.google.firebase.ml.vision.common.FirebaseVisionImage.fromByteBuffer(data, metadata);
214+
this.detector
215+
.detectInImage(this.lastVisionImage)
216+
.addOnSuccessListener(onSuccessListener)
217+
.addOnFailureListener(onFailureListener);
218+
} else {
219+
this.runDetector(data, previewSize.width, previewSize.height);
220+
}
218221
}
219-
}
220-
}));
222+
}));
221223

222-
this.camera.addCallbackBuffer(this.createPreviewBuffer(previewSize));
223-
this.camera.addCallbackBuffer(this.createPreviewBuffer(previewSize));
224-
this.camera.addCallbackBuffer(this.createPreviewBuffer(previewSize));
225-
this.camera.addCallbackBuffer(this.createPreviewBuffer(previewSize));
224+
this.camera.addCallbackBuffer(this.createPreviewBuffer(previewSize));
225+
this.camera.addCallbackBuffer(this.createPreviewBuffer(previewSize));
226+
this.camera.addCallbackBuffer(this.createPreviewBuffer(previewSize));
227+
this.camera.addCallbackBuffer(this.createPreviewBuffer(previewSize));
226228

227-
this.camera.setPreviewDisplay(surfaceHolder);
229+
this.camera.setPreviewDisplay(surfaceHolder);
228230

229-
if (!this.pause) {
230-
this.camera.startPreview();
231-
}
231+
if (!this.pause) {
232+
this.camera.startPreview();
233+
}
232234

235+
} catch (e) {
236+
console.log("Error in Firebase MLKit's runCamera function: " + e);
237+
}
233238
}, 500);
234239
}
235240

0 commit comments

Comments
 (0)