@@ -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