From 505aa1ddb98ca628f9ad27ef919ee7370feb7714 Mon Sep 17 00:00:00 2001 From: Mairramer Date: Fri, 28 Aug 2026 10:57:22 -0300 Subject: [PATCH] [camera_platform_interface] Adds videoOutputPath support to startVideoRecording --- .../camera/camera_platform_interface/CHANGELOG.md | 4 ++++ .../src/method_channel/method_channel_camera.dart | 15 +++++++++++++-- .../src/platform_interface/camera_platform.dart | 3 ++- .../lib/src/types/video_capture_options.dart | 9 ++++++++- .../camera/camera_platform_interface/pubspec.yaml | 2 +- .../method_channel_camera_test.dart | 1 + 6 files changed, 29 insertions(+), 5 deletions(-) diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index 47f4146fc8a4..eb705ff828c4 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.14.0 + +* Adds `videoOutputPath` support to `MethodChannelCamera.startVideoRecording`. + ## 2.13.1 * Changes the default implementation of `setJpegImageQuality` to a no-op so that diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart index 7423ebb1c83e..56aba6513ea0 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart @@ -230,8 +230,18 @@ class MethodChannelCamera extends CameraPlatform { _channel.invokeMethod('prepareForVideoRecording'); @override - Future startVideoRecording(int cameraId, {Duration? maxVideoDuration}) async { - return startVideoCapturing(VideoCaptureOptions(cameraId, maxDuration: maxVideoDuration)); + Future startVideoRecording( + int cameraId, { + Duration? maxVideoDuration, + String? videoOutputPath, + }) async { + return startVideoCapturing( + VideoCaptureOptions( + cameraId, + maxDuration: maxVideoDuration, + videoOutputPath: videoOutputPath, + ), + ); } @override @@ -240,6 +250,7 @@ class MethodChannelCamera extends CameraPlatform { 'cameraId': options.cameraId, 'maxVideoDuration': options.maxDuration?.inMilliseconds, 'enableStream': options.streamCallback != null, + 'videoOutputPath': options.videoOutputPath, }); if (options.streamCallback != null) { diff --git a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart index 3b49571a8529..e45adaaf7c2b 100644 --- a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart +++ b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart @@ -143,6 +143,7 @@ abstract class CameraPlatform extends PlatformInterface { int cameraId, { @Deprecated('This parameter is unused, and will be ignored on all platforms') Duration? maxVideoDuration, + String? videoOutputPath, }) { throw UnimplementedError('startVideoRecording() is not implemented.'); } @@ -152,7 +153,7 @@ abstract class CameraPlatform extends PlatformInterface { /// Please see [VideoCaptureOptions] for documentation on the /// configuration options. Future startVideoCapturing(VideoCaptureOptions options) { - return startVideoRecording(options.cameraId); + return startVideoRecording(options.cameraId, videoOutputPath: options.videoOutputPath); } /// Stops the video recording and returns the file where it was saved. diff --git a/packages/camera/camera_platform_interface/lib/src/types/video_capture_options.dart b/packages/camera/camera_platform_interface/lib/src/types/video_capture_options.dart index d5e38e8cc49a..07ccca363e33 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/video_capture_options.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/video_capture_options.dart @@ -16,6 +16,7 @@ class VideoCaptureOptions { this.streamCallback, this.streamOptions, this.enablePersistentRecording = true, + this.videoOutputPath, }) : assert( streamOptions == null || streamCallback != null, 'Must specify streamCallback if providing streamOptions.', @@ -52,6 +53,11 @@ class VideoCaptureOptions { /// Defaults to `true`. final bool enablePersistentRecording; + /// The path where the video should be saved. + /// + /// If null, the platform will generate a temporary path. + final String? videoOutputPath; + @override bool operator ==(Object other) => identical(this, other) || @@ -61,7 +67,8 @@ class VideoCaptureOptions { maxDuration == other.maxDuration && streamCallback == other.streamCallback && streamOptions == other.streamOptions && - enablePersistentRecording == other.enablePersistentRecording; + enablePersistentRecording == other.enablePersistentRecording && + videoOutputPath == other.videoOutputPath; @override int get hashCode => diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index 600718419798..6102c20a7fd4 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.13.1 +version: 2.14.0 environment: sdk: ^3.10.0 diff --git a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart index cd592fc86730..6f02e1a30d2a 100644 --- a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart +++ b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart @@ -586,6 +586,7 @@ void main() { 'cameraId': cameraId, 'maxVideoDuration': null, 'enableStream': false, + 'videoOutputPath': null, }, ), ]);