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

Commit 8e67c6c

Browse files
committed
chore(Android): Release camera in disposeNativeView
1 parent c6b7d03 commit 8e67c6c

1 file changed

Lines changed: 25 additions & 12 deletions

File tree

src/mlkit/mlkit-cameraview.android.ts

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase {
2525
protected rotation;
2626
protected lastVisionImage;
2727
private detector: any;
28+
private camera;
2829

2930
disposeNativeView(): void {
3031
super.disposeNativeView();
@@ -34,6 +35,18 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase {
3435
}
3536
this.bytesToByteBuffer = new Map();
3637
this.surfaceView = null;
38+
39+
if (this.camera != null) {
40+
this.camera.stopPreview();
41+
this.camera.setPreviewCallbackWithBuffer(null);
42+
try {
43+
this.camera.setPreviewDisplay(null);
44+
} catch (e) {
45+
console.log(e);
46+
}
47+
this.camera.release();
48+
this.camera = null;
49+
}
3750
}
3851

3952
createNativeView(): Object {
@@ -99,9 +112,9 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase {
99112
break;
100113
}
101114
}
102-
const camera = android.hardware.Camera.open(requestedCameraId);
115+
this.camera = android.hardware.Camera.open(requestedCameraId);
103116

104-
const sizePair = this.selectSizePair(camera, 800, 600); // TODO based on wrapping frame
117+
const sizePair = this.selectSizePair(this.camera, 800, 600); // TODO based on wrapping frame
105118

106119
if (!sizePair) {
107120
console.log("Could not find suitable preview size.");
@@ -111,15 +124,15 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase {
111124
let pictureSize = sizePair.pictureSize;
112125
let previewSize = sizePair.previewSize;
113126

114-
const parameters = camera.getParameters();
127+
const parameters = this.camera.getParameters();
115128

116129
if (pictureSize) {
117130
parameters.setPictureSize(pictureSize.width, pictureSize.height);
118131
}
119132
parameters.setPreviewSize(previewSize.width, previewSize.height);
120133
parameters.setPreviewFormat(android.graphics.ImageFormat.NV21);
121134

122-
this.setRotation(camera, parameters, requestedCameraId);
135+
this.setRotation(this.camera, parameters, requestedCameraId);
123136

124137
if (parameters.getSupportedFocusModes().contains(android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
125138
parameters.setFocusMode(android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
@@ -129,7 +142,7 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase {
129142
}
130143

131144
// TODO this setter seems odd, but it's part of the example: https://github.com/firebase/quickstart-android/blob/0f4c86877fc5f771cac95797dffa8bd026dd9dc7/mlkit/app/src/main/java/com/google/firebase/samples/apps/mlkit/CameraSource.java#L312
132-
camera.setParameters(parameters);
145+
this.camera.setParameters(parameters);
133146

134147
this.detector = this.createDetector();
135148
const onSuccessListener = this.createSuccessListener();
@@ -144,7 +157,7 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase {
144157
.build();
145158

146159
let throttle = 0;
147-
camera.setPreviewCallbackWithBuffer(new android.hardware.Camera.PreviewCallback({
160+
this.camera.setPreviewCallbackWithBuffer(new android.hardware.Camera.PreviewCallback({
148161
onPreviewFrame: (byteArray, camera) => {
149162

150163
if (this.pendingFrameData !== null) {
@@ -175,13 +188,13 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase {
175188
}
176189
}));
177190

178-
camera.addCallbackBuffer(this.createPreviewBuffer(previewSize));
179-
camera.addCallbackBuffer(this.createPreviewBuffer(previewSize));
180-
camera.addCallbackBuffer(this.createPreviewBuffer(previewSize));
181-
camera.addCallbackBuffer(this.createPreviewBuffer(previewSize));
191+
this.camera.addCallbackBuffer(this.createPreviewBuffer(previewSize));
192+
this.camera.addCallbackBuffer(this.createPreviewBuffer(previewSize));
193+
this.camera.addCallbackBuffer(this.createPreviewBuffer(previewSize));
194+
this.camera.addCallbackBuffer(this.createPreviewBuffer(previewSize));
182195

183-
camera.setPreviewDisplay(surfaceHolder);
184-
camera.startPreview();
196+
this.camera.setPreviewDisplay(surfaceHolder);
197+
this.camera.startPreview();
185198

186199
}, 500); // TODO 500 works fine on my device, but would be wise to explore the boundaries
187200
}

0 commit comments

Comments
 (0)