diff --git a/AUTHORS b/AUTHORS index 51345c9a3481..4adbbbce34a2 100644 --- a/AUTHORS +++ b/AUTHORS @@ -59,3 +59,4 @@ Kazuki Yamaguchi Eitan Schwartz Chris Rutkowski Juan Alvarez +Ogulcan Celik \ No newline at end of file diff --git a/packages/camera/CHANGELOG.md b/packages/camera/CHANGELOG.md index 43e5f463604c..7da63713a511 100644 --- a/packages/camera/CHANGELOG.md +++ b/packages/camera/CHANGELOG.md @@ -1,6 +1,10 @@ +## 0.5.8+4 + +* Android: Added support for JPEG callback in image stream. + ## 0.5.8+3 -* Fix bug in usage example in README.md +* Fix bug in usage example in README.md ## 0.5.8+2 @@ -106,15 +110,14 @@ ## 0.5.2 -* Added capability to disable audio for the `CameraController`. (e.g. `CameraController(_, _, - enableAudio: false);`) +* Added capability to disable audio for the `CameraController`. (e.g. `CameraController(_, _, enableAudio: false);`) ## 0.5.1 * Can now be compiled with earlier Android sdks below 21 when -`` has been added to the project -`AndroidManifest.xml`. For sdks below 21, the plugin won't be registered and calls to it will throw -a `MissingPluginException.` + `` has been added to the project + `AndroidManifest.xml`. For sdks below 21, the plugin won't be registered and calls to it will throw + a `MissingPluginException.` ## 0.5.0 @@ -236,16 +239,18 @@ a `MissingPluginException.` A lot of **breaking changes** in this version: Getter changes: - - Removed `isStarted` - - Renamed `initialized` to `isInitialized` - - Added `isRecordingVideo` + +* Removed `isStarted` +* Renamed `initialized` to `isInitialized` +* Added `isRecordingVideo` Method changes: - - Renamed `capture` to `takePicture` - - Removed `start` (the preview starts automatically when `initialize` is called) - - Added `startVideoRecording(String filePath)` - - Removed `stop` (the preview stops automatically when `dispose` is called) - - Added `stopVideoRecording` + +* Renamed `capture` to `takePicture` +* Removed `start` (the preview starts automatically when `initialize` is called) +* Added `startVideoRecording(String filePath)` +* Removed `stop` (the preview stops automatically when `dispose` is called) +* Added `stopVideoRecording` ## 0.1.2 diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index 0fcda278d836..1459788b4580 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -49,6 +49,7 @@ public class Camera { private final Size captureSize; private final Size previewSize; private final boolean enableAudio; + private final int imageFormat; private CameraDevice cameraDevice; private CameraCaptureSession cameraCaptureSession; @@ -77,7 +78,8 @@ public Camera( final DartMessenger dartMessenger, final String cameraName, final String resolutionPreset, - final boolean enableAudio) + final boolean enableAudio, + final int imageFormat) throws CameraAccessException { if (activity == null) { throw new IllegalStateException("No activity available!"); @@ -85,6 +87,11 @@ public Camera( this.cameraName = cameraName; this.enableAudio = enableAudio; + if (imageFormat != 256 || imageFormat != 35) { + this.imageFormat = 35; + } else { + this.imageFormat = imageFormat; + } this.flutterTexture = flutterTexture; this.dartMessenger = dartMessenger; this.cameraManager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); @@ -148,7 +155,7 @@ public void open(@NonNull final Result result) throws CameraAccessException { // Used to steam image byte data to dart side. imageStreamReader = ImageReader.newInstance( - previewSize.getWidth(), previewSize.getHeight(), ImageFormat.YUV_420_888, 2); + previewSize.getWidth(), previewSize.getHeight(), this.imageFormat, 2); cameraManager.openCamera( cameraName, diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java index cb58d19a9a02..41a3730eb0bc 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java @@ -106,6 +106,7 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) case "startImageStream": { try { + call.arguments(); camera.startPreviewWithImageStream(imageStreamChannel); result.success(null); } catch (Exception e) { @@ -145,6 +146,7 @@ private void instantiateCamera(MethodCall call, Result result) throws CameraAcce String cameraName = call.argument("cameraName"); String resolutionPreset = call.argument("resolutionPreset"); boolean enableAudio = call.argument("enableAudio"); + int androidFormatCode = call.argument("androidFormatCode"); TextureRegistry.SurfaceTextureEntry flutterSurfaceTexture = textureRegistry.createSurfaceTexture(); DartMessenger dartMessenger = new DartMessenger(messenger, flutterSurfaceTexture.id()); @@ -155,7 +157,8 @@ private void instantiateCamera(MethodCall call, Result result) throws CameraAcce dartMessenger, cameraName, resolutionPreset, - enableAudio); + enableAudio, + androidFormatCode); camera.open(result); } diff --git a/packages/camera/lib/camera.dart b/packages/camera/lib/camera.dart index ce9fd9430dde..7084339d8665 100644 --- a/packages/camera/lib/camera.dart +++ b/packages/camera/lib/camera.dart @@ -245,6 +245,7 @@ class CameraController extends ValueNotifier { this.description, this.resolutionPreset, { this.enableAudio = true, + this.androidFormatCode = 35, }) : super(const CameraValue.uninitialized()); final CameraDescription description; @@ -253,6 +254,16 @@ class CameraController extends ValueNotifier { /// Whether to include audio when recording a video. final bool enableAudio; + /// Define streaming image format for Android. + /// + /// Default is `35` which is `YUV_420_888` on Android. See: + /// https://developer.android.com/reference/android/graphics/ImageFormat#YUV_420_888 + /// + /// Other option is `256` which is `JPEG`. When you specified the JPEG option, + /// [CameraImage] will have only one plane which is encoded JPEG bytes. + /// https://developer.android.com/reference/android/graphics/ImageFormat#JPEG + final int androidFormatCode; + int _textureId; bool _isDisposed = false; StreamSubscription _eventSubscription; @@ -266,6 +277,10 @@ class CameraController extends ValueNotifier { if (_isDisposed) { return Future.value(); } + if (androidFormatCode != 256 && androidFormatCode != 35) { + throw CameraException('Unknown Image Format Code.', + 'CameraController initialized with an unknown Image Format Code.'); + } try { _creatingCompleter = Completer(); final Map reply = @@ -275,6 +290,7 @@ class CameraController extends ValueNotifier { 'cameraName': description.name, 'resolutionPreset': serializeResolutionPreset(resolutionPreset), 'enableAudio': enableAudio, + 'androidFormatCode': androidFormatCode, }, ); _textureId = reply['textureId']; diff --git a/packages/camera/lib/camera_image.dart b/packages/camera/lib/camera_image.dart index cebc14873f52..983bbc405c20 100644 --- a/packages/camera/lib/camera_image.dart +++ b/packages/camera/lib/camera_image.dart @@ -61,7 +61,15 @@ enum ImageFormatGroup { /// /// On iOS, this is `kCVPixelFormatType_32BGRA`. See /// https://developer.apple.com/documentation/corevideo/1563591-pixel_format_identifiers/kcvpixelformattype_32bgra?language=objc + /// bgra8888, + + /// 32-big RGB image encoded into JPEG bytes. + /// + /// On Android, this is `android.graphics.ImageFormat.JPEG`. See + /// https://developer.android.com/reference/android/graphics/ImageFormat#JPEG + /// + jpeg } /// Describes how pixels are represented in an image. @@ -83,9 +91,13 @@ class ImageFormat { ImageFormatGroup _asImageFormatGroup(dynamic rawFormat) { if (defaultTargetPlatform == TargetPlatform.android) { - // android.graphics.ImageFormat.YUV_420_888 - if (rawFormat == 35) { - return ImageFormatGroup.yuv420; + switch (rawFormat) { + // android.graphics.ImageFormat.JPEG + case 256: + return ImageFormatGroup.jpeg; + // android.graphics.ImageFormat.YUV_420_888 + case 42: + return ImageFormatGroup.yuv420; } } diff --git a/packages/camera/pubspec.yaml b/packages/camera/pubspec.yaml index a1ce42370191..a93c016e1f10 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.5.8+3 +version: 0.5.8+4 homepage: https://github.com/flutter/plugins/tree/master/packages/camera