diff --git a/packages/camera/CHANGELOG.md b/packages/camera/CHANGELOG.md index 5d349bd8998b..346afa736fc4 100644 --- a/packages/camera/CHANGELOG.md +++ b/packages/camera/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.3 + +* Add capability to prepare the capture session for video recording on iOS. + ## 0.4.2 * Add sensor orientation value to `CameraDescription`. diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java index 7ab3c44f962a..a204c1749264 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java @@ -205,6 +205,12 @@ public void onMethodCall(MethodCall call, final Result result) { camera.takePicture((String) call.argument("path"), result); break; } + case "prepareForVideoRecording": + { + // This optimization is not required for Android. + result.success(null); + break; + } case "startVideoRecording": { final String filePath = call.argument("filePath"); diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index 643f361689b2..7d5d28d3a3a7 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -467,9 +467,7 @@ - (void)startVideoRecordingAtPath:(NSString *)path result:(FlutterResult)result _eventSink(@{@"event" : @"error", @"errorDescription" : @"Setup Writer Failed"}); return; } - [_captureSession stopRunning]; _isRecording = YES; - [_captureSession startRunning]; result(nil); } else { _eventSink(@{@"event" : @"error", @"errorDescription" : @"Video is already recording!"}); @@ -726,6 +724,9 @@ - (void)handleMethodCallAsync:(FlutterMethodCall *)call result:(FlutterResult)re [_camera close]; _dispatchQueue = nil; result(nil); + } else if ([@"prepareForVideoRecording" isEqualToString:call.method]) { + [_camera setUpCaptureSessionForAudio]; + result(nil); } else if ([@"startVideoRecording" isEqualToString:call.method]) { [_camera startVideoRecordingAtPath:call.arguments[@"filePath"] result:result]; } else if ([@"stopVideoRecording" isEqualToString:call.method]) { diff --git a/packages/camera/lib/camera.dart b/packages/camera/lib/camera.dart index 090e7767c95c..8edbb8c59658 100644 --- a/packages/camera/lib/camera.dart +++ b/packages/camera/lib/camera.dart @@ -256,6 +256,24 @@ class CameraController extends ValueNotifier { return _creatingCompleter.future; } + /// Prepare the capture session for video recording. + /// + /// Use of this method is optional, but it may be called for performance + /// reasons on iOS. + /// + /// Preparing audio can cause a minor delay in the CameraPreview view on iOS. + /// If video recording is intended, calling this early eliminates this delay + /// that would otherwise be experienced when video recording is started. + /// This operation is a no-op on Android. + /// + /// Throws a [CameraException] if the prepare fails. + Future prepareForVideoRecording() async { + // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. + // https://github.com/flutter/flutter/issues/26431 + // ignore: strong_mode_implicit_dynamic_method + await _channel.invokeMethod('prepareForVideoRecording'); + } + /// Listen to events from the native plugins. /// /// A "cameraClosing" event is sent when the camera is closed automatically by the system (for example when the app go to background). The plugin will try to reopen the camera automatically but any ongoing recording will end. diff --git a/packages/camera/pubspec.yaml b/packages/camera/pubspec.yaml index 0abbf6a003aa..d3ecc1bc5eeb 100644 --- a/packages/camera/pubspec.yaml +++ b/packages/camera/pubspec.yaml @@ -2,7 +2,7 @@ name: camera description: A Flutter plugin for getting information about and controlling the camera on Android and iOS. Supports previewing the camera feed, capturing images, capturing video, and streaming image buffers to dart. -version: 0.4.2 +version: 0.4.3 authors: - Flutter Team - Luigi Agosti