@@ -68,7 +68,7 @@ interface ErrorCallback {
6868 void onError (String errorCode , String errorMessage );
6969}
7070
71- public class Camera {
71+ class Camera implements CameraCaptureCallback . CameraCaptureStateListener {
7272 private static final String TAG = "Camera" ;
7373
7474 /** Conversion from screen rotation to JPEG orientation. */
@@ -92,7 +92,6 @@ public class Camera {
9292
9393 private final SurfaceTextureEntry flutterTexture ;
9494 private final DeviceOrientationManager deviceOrientationListener ;
95- private final boolean isFrontFacing ;
9695 private final int sensorOrientation ;
9796 private final Size captureSize ;
9897 private final Size previewSize ;
@@ -166,88 +165,7 @@ public void onImageAvailable(ImageReader reader) {
166165 private CameraRegions cameraRegions ;
167166 private int exposureOffset ;
168167 /** A {@link CameraCaptureSession.CaptureCallback} that handles events related to JPEG capture. */
169- private final CameraCaptureSession .CaptureCallback mCaptureCallback =
170- new CameraCaptureSession .CaptureCallback () {
171-
172- private void process (CaptureResult result ) {
173- Integer aeState = result .get (CaptureResult .CONTROL_AE_STATE );
174- Integer afState = result .get (CaptureResult .CONTROL_AF_STATE );
175-
176- if (cameraState != CameraState .STATE_PREVIEW ) {
177- // Log.i(TAG, "mCaptureCallback | state: " + cameraState + " | afState: " + afState + " | aeState: " + aeState);
178- }
179-
180- switch (cameraState ) {
181- case STATE_PREVIEW :
182- {
183- // We have nothing to do when the camera preview is working normally.
184- break ;
185- }
186-
187- case STATE_WAITING_FOCUS :
188- {
189- if (afState == null ) {
190- return ;
191- } else if (afState == CaptureRequest .CONTROL_AF_STATE_PASSIVE_SCAN
192- || afState == CaptureRequest .CONTROL_AF_STATE_FOCUSED_LOCKED
193- || afState == CaptureRequest .CONTROL_AF_STATE_NOT_FOCUSED_LOCKED ) {
194- // CONTROL_AE_STATE can be null on some devices
195-
196- if (aeState == null || aeState == CaptureRequest .CONTROL_AE_STATE_CONVERGED ) {
197- takePictureAfterPrecapture ();
198- } else {
199- runPrecaptureSequence ();
200- }
201- }
202- break ;
203- }
204-
205- case STATE_WAITING_PRECAPTURE_START :
206- {
207- // CONTROL_AE_STATE can be null on some devices
208- if (aeState == null
209- || aeState == CaptureResult .CONTROL_AE_STATE_CONVERGED
210- || aeState == CaptureResult .CONTROL_AE_STATE_PRECAPTURE
211- || aeState == CaptureResult .CONTROL_AE_STATE_FLASH_REQUIRED ) {
212- cameraState = CameraState .STATE_WAITING_PRECAPTURE_DONE ;
213- pictureCaptureRequest .setState (
214- PictureCaptureRequestState .STATE_WAITING_PRECAPTURE_DONE );
215- }
216- break ;
217- }
218-
219- case STATE_WAITING_PRECAPTURE_DONE :
220- {
221- // CONTROL_AE_STATE can be null on some devices
222- if (aeState == null || aeState != CaptureResult .CONTROL_AE_STATE_PRECAPTURE ) {
223- takePictureAfterPrecapture ();
224- } else {
225- if (pictureCaptureRequest .hitPreCaptureTimeout ()) {
226- // Log.i(TAG, "===> Hit precapture timeout");
227- unlockAutoFocus ();
228- }
229- }
230- break ;
231- }
232- }
233- }
234-
235- @ Override
236- public void onCaptureProgressed (
237- @ NonNull CameraCaptureSession session ,
238- @ NonNull CaptureRequest request ,
239- @ NonNull CaptureResult partialResult ) {
240- process (partialResult );
241- }
242-
243- @ Override
244- public void onCaptureCompleted (
245- @ NonNull CameraCaptureSession session ,
246- @ NonNull CaptureRequest request ,
247- @ NonNull TotalCaptureResult result ) {
248- process (result );
249- }
250- };
168+ private final CameraCaptureCallback mCaptureCallback ;
251169
252170 private Range <Integer > fpsRange ;
253171 private PlatformChannel .DeviceOrientation lockedCaptureOrientation ;
@@ -259,24 +177,6 @@ public Camera(
259177 final CameraProperties cameraProperties ,
260178 final ResolutionPreset resolutionPreset ,
261179 final boolean enableAudio ) {
262- this (
263- activity ,
264- flutterTexture ,
265- dartMessenger ,
266- cameraProperties ,
267- resolutionPreset ,
268- enableAudio ,
269- null );
270- }
271-
272- public Camera (
273- final Activity activity ,
274- final SurfaceTextureEntry flutterTexture ,
275- final DartMessenger dartMessenger ,
276- final CameraProperties cameraProperties ,
277- final ResolutionPreset resolutionPreset ,
278- final boolean enableAudio ,
279- @ Nullable final DeviceOrientationManager deviceOrientationManager ) {
280180
281181 if (activity == null ) {
282182 throw new IllegalStateException ("No activity available!" );
@@ -293,19 +193,18 @@ public Camera(
293193 this .currentFocusMode = FocusMode .auto ;
294194 this .exposureOffset = 0 ;
295195
196+ mCaptureCallback = CameraCaptureCallback .create (this );
197+
296198 // Get camera characteristics and check for supported features
297199 getAvailableFpsRange (cameraProperties );
298200 mAutoFocusSupported = checkAutoFocusSupported (cameraProperties );
299201 checkFlashSupported ();
300202
301203 // Setup orientation
302204 sensorOrientation = cameraProperties .getSensorOrientation ();
303- isFrontFacing = cameraProperties .getLensFacing () == CameraMetadata .LENS_FACING_FRONT ;
205+ boolean isFrontFacing = cameraProperties .getLensFacing () == CameraMetadata .LENS_FACING_FRONT ;
304206
305- deviceOrientationListener =
306- deviceOrientationManager != null
307- ? deviceOrientationManager
308- : new DeviceOrientationManager (
207+ deviceOrientationListener = DeviceOrientationManager .create (
309208 activity , dartMessenger , isFrontFacing , sensorOrientation );
310209 deviceOrientationListener .start ();
311210
@@ -330,6 +229,21 @@ public Camera(
330229 startBackgroundThread ();
331230 }
332231
232+ @ Override
233+ public void onConverged () {
234+ takePictureAfterPrecapture ();
235+ }
236+
237+ @ Override
238+ public void onPrecapture () {
239+ runPrecaptureSequence ();
240+ }
241+
242+ @ Override
243+ public void onPrecaptureTimeout () {
244+ unlockAutoFocus ();
245+ }
246+
333247 /** Get the current camera state (use for testing). */
334248 public CameraState getState () {
335249 return this .cameraState ;
@@ -642,7 +556,8 @@ public void takePicture(@NonNull final Result result) {
642556 final File file = File .createTempFile ("CAP" , ".jpg" , outputDir );
643557
644558 // Start a new capture
645- pictureCaptureRequest = new PictureCaptureRequest (result , file , dartMessenger );
559+ pictureCaptureRequest = PictureCaptureRequest .create (result , file , dartMessenger );
560+ mCaptureCallback .setPictureCaptureRequest (pictureCaptureRequest );
646561 } catch (IOException | SecurityException e ) {
647562 pictureCaptureRequest .error ("cannotCreateFile" , e .getMessage (), null );
648563 return ;
0 commit comments