diff --git a/packages/camera/camera_platform_interface/AUTHORS b/packages/camera/camera_platform_interface/AUTHORS index 493a0b4ef9c2..0d1bfa6a90c7 100644 --- a/packages/camera/camera_platform_interface/AUTHORS +++ b/packages/camera/camera_platform_interface/AUTHORS @@ -64,3 +64,4 @@ Aleksandr Yurkovskiy Anton Borries Alex Li Rahul Raj <64.rahulraj@gmail.com> +Mairramer diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index f5d581c99b5c..f31511df65a5 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 2.7.0 +* Adds support for setting the image file format. See `CameraPlatform.setImageFileFormat`. * Updates minimum supported SDK version to Flutter 3.10/Dart 3.0. ## 2.6.0 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 35ece04fdf52..7ee0ed4e7b97 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 @@ -529,6 +529,17 @@ class MethodChannelCamera extends CameraPlatform { ); } + @override + Future setImageFileFormat(int cameraId, ImageFileFormat format) { + return _channel.invokeMethod( + 'setImageFileFormat', + { + 'cameraId': cameraId, + 'fileFormat': format.name, + }, + ); + } + @override Widget buildPreview(int cameraId) { return Texture(textureId: cameraId); 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 b74cb4203324..6707962cbc1f 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 @@ -298,4 +298,12 @@ abstract class CameraPlatform extends PlatformInterface { Future dispose(int cameraId) { throw UnimplementedError('dispose() is not implemented.'); } + + /// Sets the output image file format for the selected camera. + /// + // TODO(bmparr): This is only supported on iOS. See + // https://github.com/flutter/flutter/issues/139588 + Future setImageFileFormat(int cameraId, ImageFileFormat format) { + throw UnimplementedError('setImageFileFormat() is not implemented.'); + } } diff --git a/packages/camera/camera_platform_interface/lib/src/types/image_file_format.dart b/packages/camera/camera_platform_interface/lib/src/types/image_file_format.dart new file mode 100644 index 000000000000..e745dc5e1fd6 --- /dev/null +++ b/packages/camera/camera_platform_interface/lib/src/types/image_file_format.dart @@ -0,0 +1,15 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/// The format in which images should be returned from the camera. +enum ImageFileFormat { + /// The JPEG format. + jpeg, + + /// The HEIF format. + /// + /// HEIF is a file format name that refers to High Efficiency Image Format + /// (HEIF). For iOS, this is only supported on versions 11+. + heif, +} diff --git a/packages/camera/camera_platform_interface/lib/src/types/types.dart b/packages/camera/camera_platform_interface/lib/src/types/types.dart index f9a81559d680..e56b9b4c49a1 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/types.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/types.dart @@ -8,6 +8,7 @@ export 'camera_image_data.dart'; export 'exposure_mode.dart'; export 'flash_mode.dart'; export 'focus_mode.dart'; +export 'image_file_format.dart'; export 'image_format_group.dart'; export 'media_settings.dart'; export 'resolution_preset.dart'; diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index e72afcf5a2d8..3bf2055f91c9 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.6.0 +version: 2.7.0 environment: sdk: ">=3.0.0 <4.0.0" diff --git a/packages/camera/camera_platform_interface/test/events/camera_event_test.dart b/packages/camera/camera_platform_interface/test/events/camera_event_test.dart index 074f203bea21..cb1e34845b3f 100644 --- a/packages/camera/camera_platform_interface/test/events/camera_event_test.dart +++ b/packages/camera/camera_platform_interface/test/events/camera_event_test.dart @@ -31,7 +31,7 @@ void main() { 'exposureMode': 'auto', 'exposurePointSupported': true, 'focusMode': 'auto', - 'focusPointSupported': true + 'focusPointSupported': true, }); expect(event.cameraId, 1); 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 8159cdfe26f5..7cf878b8c385 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 @@ -1154,6 +1154,46 @@ void main() { isMethodCall('stopImageStream', arguments: null), ]); }); + + test('Should set the ImageFileFormat to heif', () async { + // Arrange + final MethodChannelMock channel = MethodChannelMock( + channelName: 'plugins.flutter.io/camera', + methods: {'setImageFileFormat': 'heif'}, + ); + + // Act + await camera.setImageFileFormat(cameraId, ImageFileFormat.heif); + + // Assert + expect(channel.log, [ + isMethodCall('setImageFileFormat', arguments: { + 'cameraId': cameraId, + 'fileFormat': 'heif', + }), + ]); + }); + + test('Should set the ImageFileFormat to jpeg', () async { + // Arrange + final MethodChannelMock channel = MethodChannelMock( + channelName: 'plugins.flutter.io/camera', + methods: { + 'setImageFileFormat': 'jpeg', + }, + ); + + // Act + await camera.setImageFileFormat(cameraId, ImageFileFormat.jpeg); + + // Assert + expect(channel.log, [ + isMethodCall('setImageFileFormat', arguments: { + 'cameraId': cameraId, + 'fileFormat': 'jpeg', + }), + ]); + }); }); }); }