@@ -522,6 +522,21 @@ private void refreshPreviewCaptureSession(
522
522
}
523
523
}
524
524
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
+
525
540
public void takePicture (@ NonNull final Result result ) {
526
541
// Only take one picture at a time.
527
542
if (cameraCaptureCallback .getCameraState () != CameraState .STATE_PREVIEW ) {
@@ -731,29 +746,17 @@ private void unlockAutoFocus() {
731
746
dartMessenger .error (flutterResult , errorCode , errorMessage , null ));
732
747
}
733
748
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 ;
741
- }
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
+ public void startVideoRecording (
750
+ @ NonNull Result result , @ Nullable EventChannel imageStreamChannel ) {
751
+ prepareRecording (result );
752
+
753
+ if (imageStreamChannel != null ) {
754
+ setStreamHandler (imageStreamChannel );
749
755
}
750
- // Re-create autofocus feature so it's using video focus mode now.
751
- cameraFeatures .setAutoFocus (
752
- cameraFeatureFactory .createAutoFocusFeature (cameraProperties , true ));
756
+
753
757
recordingVideo = true ;
754
758
try {
755
- createCaptureSession (
756
- CameraDevice .TEMPLATE_RECORD , () -> mediaRecorder .start (), mediaRecorder .getSurface ());
759
+ startCapture (true , imageStreamChannel != null );
757
760
result .success (null );
758
761
} catch (CameraAccessException e ) {
759
762
recordingVideo = false ;
@@ -1073,21 +1076,10 @@ public void startPreview() throws CameraAccessException {
1073
1076
1074
1077
public void startPreviewWithImageStream (EventChannel imageStreamChannel )
1075
1078
throws CameraAccessException {
1076
- createCaptureSession (CameraDevice .TEMPLATE_RECORD , imageStreamReader .getSurface ());
1077
- 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
- }
1079
+ setStreamHandler (imageStreamChannel );
1085
1080
1086
- @ Override
1087
- public void onCancel (Object o ) {
1088
- imageStreamReader .setOnImageAvailableListener (null , backgroundHandler );
1089
- }
1090
- });
1081
+ startCapture (false , true );
1082
+ Log .i (TAG , "startPreviewWithImageStream" );
1091
1083
}
1092
1084
1093
1085
/**
@@ -1117,6 +1109,42 @@ public void onError(String errorCode, String errorMessage) {
1117
1109
cameraCaptureCallback .setCameraState (CameraState .STATE_PREVIEW );
1118
1110
}
1119
1111
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
+
1120
1148
private void setImageStreamImageAvailableListener (final EventChannel .EventSink imageStreamSink ) {
1121
1149
imageStreamReader .setOnImageAvailableListener (
1122
1150
reader -> {
0 commit comments