@@ -522,21 +522,6 @@ private void refreshPreviewCaptureSession(
522522 }
523523 }
524524
525- private void startCapture (boolean record , boolean stream ) throws CameraAccessException {
526- List <Surface > surfaces = new ArrayList <>();
527- Runnable successCallback = null ;
528- if (record ) {
529- surfaces .add (mediaRecorder .getSurface ());
530- successCallback = () -> mediaRecorder .start ();
531- }
532- if (stream ) {
533- surfaces .add (imageStreamReader .getSurface ());
534- }
535-
536- createCaptureSession (
537- CameraDevice .TEMPLATE_RECORD , successCallback , surfaces .toArray (new Surface [0 ]));
538- }
539-
540525 public void takePicture (@ NonNull final Result result ) {
541526 // Only take one picture at a time.
542527 if (cameraCaptureCallback .getCameraState () != CameraState .STATE_PREVIEW ) {
@@ -746,17 +731,29 @@ private void unlockAutoFocus() {
746731 dartMessenger .error (flutterResult , errorCode , errorMessage , null ));
747732 }
748733
749- public void startVideoRecording (
750- @ NonNull Result result , @ Nullable EventChannel imageStreamChannel ) {
751- prepareRecording (result );
752-
753- if (imageStreamChannel != null ) {
754- setStreamHandler (imageStreamChannel );
734+ public void startVideoRecording (@ NonNull Result result ) {
735+ final File outputDir = applicationContext .getCacheDir ();
736+ try {
737+ captureFile = File .createTempFile ("REC" , ".mp4" , outputDir );
738+ } catch (IOException | SecurityException e ) {
739+ result .error ("cannotCreateFile" , e .getMessage (), null );
740+ return ;
755741 }
756-
742+ try {
743+ prepareMediaRecorder (captureFile .getAbsolutePath ());
744+ } catch (IOException e ) {
745+ recordingVideo = false ;
746+ captureFile = null ;
747+ result .error ("videoRecordingFailed" , e .getMessage (), null );
748+ return ;
749+ }
750+ // Re-create autofocus feature so it's using video focus mode now.
751+ cameraFeatures .setAutoFocus (
752+ cameraFeatureFactory .createAutoFocusFeature (cameraProperties , true ));
757753 recordingVideo = true ;
758754 try {
759- startCapture (true , imageStreamChannel != null );
755+ createCaptureSession (
756+ CameraDevice .TEMPLATE_RECORD , () -> mediaRecorder .start (), mediaRecorder .getSurface ());
760757 result .success (null );
761758 } catch (CameraAccessException e ) {
762759 recordingVideo = false ;
@@ -1076,10 +1073,21 @@ public void startPreview() throws CameraAccessException {
10761073
10771074 public void startPreviewWithImageStream (EventChannel imageStreamChannel )
10781075 throws CameraAccessException {
1079- setStreamHandler (imageStreamChannel );
1080-
1081- startCapture (false , true );
1076+ createCaptureSession (CameraDevice .TEMPLATE_RECORD , imageStreamReader .getSurface ());
10821077 Log .i (TAG , "startPreviewWithImageStream" );
1078+
1079+ imageStreamChannel .setStreamHandler (
1080+ new EventChannel .StreamHandler () {
1081+ @ Override
1082+ public void onListen (Object o , EventChannel .EventSink imageStreamSink ) {
1083+ setImageStreamImageAvailableListener (imageStreamSink );
1084+ }
1085+
1086+ @ Override
1087+ public void onCancel (Object o ) {
1088+ imageStreamReader .setOnImageAvailableListener (null , backgroundHandler );
1089+ }
1090+ });
10831091 }
10841092
10851093 /**
@@ -1109,42 +1117,6 @@ public void onError(String errorCode, String errorMessage) {
11091117 cameraCaptureCallback .setCameraState (CameraState .STATE_PREVIEW );
11101118 }
11111119
1112- private void prepareRecording (@ NonNull Result result ) {
1113- final File outputDir = applicationContext .getCacheDir ();
1114- try {
1115- captureFile = File .createTempFile ("REC" , ".mp4" , outputDir );
1116- } catch (IOException | SecurityException e ) {
1117- result .error ("cannotCreateFile" , e .getMessage (), null );
1118- return ;
1119- }
1120- try {
1121- prepareMediaRecorder (captureFile .getAbsolutePath ());
1122- } catch (IOException e ) {
1123- recordingVideo = false ;
1124- captureFile = null ;
1125- result .error ("videoRecordingFailed" , e .getMessage (), null );
1126- return ;
1127- }
1128- // Re-create autofocus feature so it's using video focus mode now.
1129- cameraFeatures .setAutoFocus (
1130- cameraFeatureFactory .createAutoFocusFeature (cameraProperties , true ));
1131- }
1132-
1133- private void setStreamHandler (EventChannel imageStreamChannel ) {
1134- imageStreamChannel .setStreamHandler (
1135- new EventChannel .StreamHandler () {
1136- @ Override
1137- public void onListen (Object o , EventChannel .EventSink imageStreamSink ) {
1138- setImageStreamImageAvailableListener (imageStreamSink );
1139- }
1140-
1141- @ Override
1142- public void onCancel (Object o ) {
1143- imageStreamReader .setOnImageAvailableListener (null , backgroundHandler );
1144- }
1145- });
1146- }
1147-
11481120 private void setImageStreamImageAvailableListener (final EventChannel .EventSink imageStreamSink ) {
11491121 imageStreamReader .setOnImageAvailableListener (
11501122 reader -> {
0 commit comments