From aea285b0479581143e40f8c430b03071f580724c Mon Sep 17 00:00:00 2001 From: Ivan Kuz Date: Sat, 2 Mar 2019 21:50:52 +0400 Subject: [PATCH 1/6] android implementation --- .../flutter/plugins/camera/CameraPlugin.java | 67 ++++++++++++++++++- packages/camera/example/lib/main.dart | 30 ++++++++- packages/camera/lib/camera.dart | 8 +++ 3 files changed, 103 insertions(+), 2 deletions(-) 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 8cdc95e19790..f1235af0573c 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 @@ -9,6 +9,7 @@ import android.content.pm.PackageManager; import android.graphics.ImageFormat; import android.graphics.Point; +import android.graphics.Rect; import android.graphics.SurfaceTexture; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCaptureSession; @@ -246,6 +247,26 @@ public void onMethodCall(MethodCall call, final Result result) { result.success(null); break; } + case "zoomIn": + { + try { + camera.zoomIn(); + result.success(null); + } catch (CameraAccessException e) { + result.error("CameraAccess", e.getMessage(), null); + } + break; + } + case "zoomOut": + { + try { + camera.zoomOut(); + result.success(null); + } catch (CameraAccessException e) { + result.error("CameraAccess", e.getMessage(), null); + } + break; + } default: result.notImplemented(); break; @@ -290,6 +311,10 @@ private class Camera { private MediaRecorder mediaRecorder; private boolean recordingVideo; + public float zoomLevel = 1f; + public Rect zoom; + protected CameraCharacteristics cameraCharacteristics; + Camera(final String cameraName, final String resolutionPreset, @NonNull final Result result) { this.cameraName = cameraName; @@ -316,6 +341,8 @@ private class Camera { CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraName); StreamConfigurationMap streamConfigurationMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); + cameraCharacteristics = characteristics; + //noinspection ConstantConditions sensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); //noinspection ConstantConditions @@ -602,7 +629,7 @@ public void onImageAvailable(ImageReader reader) { cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); captureBuilder.addTarget(pictureImageReader.getSurface()); captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getMediaOrientation()); - + setScalerCropRegion(captureBuilder, zoom); cameraCaptureSession.capture( captureBuilder.build(), new CameraCaptureSession.CaptureCallback() { @@ -676,6 +703,7 @@ public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { Camera.this.cameraCaptureSession = cameraCaptureSession; captureRequestBuilder.set( CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); + setScalerCropRegion(captureRequestBuilder, zoom); cameraCaptureSession.setRepeatingRequest( captureRequestBuilder.build(), null, null); mediaRecorder.start(); @@ -742,6 +770,7 @@ public void onConfigured(@NonNull CameraCaptureSession session) { cameraCaptureSession = session; captureRequestBuilder.set( CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); + setScalerCropRegion(captureRequestBuilder, zoom); cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null); } catch (CameraAccessException e) { sendErrorEvent(e.getMessage()); @@ -787,6 +816,7 @@ public void onConfigured(@NonNull CameraCaptureSession session) { cameraCaptureSession = session; captureRequestBuilder.set( CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); + setScalerCropRegion(captureRequestBuilder, zoom); cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null); } catch (CameraAccessException e) { sendErrorEvent(e.getMessage()); @@ -907,5 +937,40 @@ private int getMediaOrientation() { : (isFrontFacing) ? -currentOrientation : currentOrientation; return (sensorOrientationOffset + sensorOrientation + 360) % 360; } + + public void zoomIn() throws CameraAccessException { + changeZoom(1); + } + + public void zoomOut() throws CameraAccessException { + changeZoom(-1); + } + + private void changeZoom(int step) throws CameraAccessException { + calculateZoom(step); + setScalerCropRegion(captureRequestBuilder, zoom); + cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null); + } + + private void calculateZoom(int step) { + zoomLevel += step; + + if (zoomLevel < 1f) { + zoomLevel = 1f; + return; + } + + Rect rect = cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE); + + float ratio = (float) 1 / zoomLevel; + int croppedWidth = rect.width() - Math.round((float) rect.width() * ratio); + int croppedHeight = rect.height() - Math.round((float) rect.height() * ratio); + zoom = new Rect(croppedWidth / 2, croppedHeight / 2, + rect.width() - croppedWidth / 2, rect.height() - croppedHeight / 2); + } + + private void setScalerCropRegion(CaptureRequest.Builder captureRequestBuilder, Rect zoom) { + captureRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoom); + } } } diff --git a/packages/camera/example/lib/main.dart b/packages/camera/example/lib/main.dart index ca01a7ac0f57..82cc06846ea5 100644 --- a/packages/camera/example/lib/main.dart +++ b/packages/camera/example/lib/main.dart @@ -161,7 +161,21 @@ class _CameraExampleHomeState extends State { controller.value.isRecordingVideo ? onStopButtonPressed : null, - ) + ), + IconButton( + icon: const Icon(Icons.zoom_in), + color: Colors.blue, + onPressed: controller != null + ? onZoomInButtonPressed + : null, + ), + IconButton( + icon: const Icon(Icons.zoom_out), + color: Colors.blue, + onPressed: controller != null + ? onZoomOutButtonPressed + : null, + ), ], ); } @@ -251,6 +265,20 @@ class _CameraExampleHomeState extends State { }); } + void onZoomInButtonPressed() { + if (controller == null) { + return; + } + controller.zoomIn(); + } + + void onZoomOutButtonPressed() { + if (controller == null) { + return; + } + controller.zoomOut(); + } + Future startVideoRecording() async { if (!controller.value.isInitialized) { showInSnackBar('Error: select a camera first.'); diff --git a/packages/camera/lib/camera.dart b/packages/camera/lib/camera.dart index cf636a199b1f..5d51318ba0ab 100644 --- a/packages/camera/lib/camera.dart +++ b/packages/camera/lib/camera.dart @@ -485,4 +485,12 @@ class CameraController extends ValueNotifier { await _eventSubscription?.cancel(); } } + + Future zoomIn() async { + await _channel.invokeMethod('zoomIn'); + } + + Future zoomOut() async { + await _channel.invokeMethod('zoomOut'); + } } From ca53b29e854246bfcdd3af2a8037eaa0f949617b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=D0=9A=D1=83=D0=B7=D0=BD=D0=B5=D1=86=D0=BE=D0=B2?= Date: Sat, 2 Mar 2019 10:40:19 -0800 Subject: [PATCH 2/6] ios implementation --- packages/camera/ios/Classes/CameraPlugin.m | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index 81e0d18df845..03fb83dd07c7 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -144,6 +144,7 @@ @interface FLTCam : NSObject *)messenger; - (void)stopImageStream; - (void)captureToFile:(NSString *)filename result:(FlutterResult)result; +- (void)zoonIn; +- (void)zoomOut; @end @implementation FLTCam @@ -162,6 +165,8 @@ - (instancetype)initWithCameraName:(NSString *)cameraName resolutionPreset:(NSString *)resolutionPreset error:(NSError **)error { self = [super init]; + _zoom = 1; + NSAssert(self, @"super init cannot be nil"); _captureSession = [[AVCaptureSession alloc] init]; @@ -209,6 +214,26 @@ - (void)stop { [_captureSession stopRunning]; } +- (void)zoomIn { + _zoom++; + [_captureDevice lockForConfiguration:NULL]; + [_captureDevice setVideoZoomFactor:_zoom]; + [_captureDevice unlockForConfiguration]; +} + +- (void)zoomOut { + _zoom--; + + if (_zoom < 1) { + _zoom = 1; + return; + } + + [_captureDevice lockForConfiguration:NULL]; + [_captureDevice setVideoZoomFactor:_zoom]; + [_captureDevice unlockForConfiguration]; +} + - (void)captureToFile:(NSString *)path result:(FlutterResult)result { AVCapturePhotoSettings *settings = [AVCapturePhotoSettings photoSettings]; [settings setHighResolutionPhotoEnabled:YES]; @@ -696,6 +721,12 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result } else if ([@"stopImageStream" isEqualToString:call.method]) { [_camera stopImageStream]; result(nil); + } else if ([@"zoomIn" isEqualToString:call.method]) { + [_camera zoomIn]; + result(nil); + } else if ([@"zoomOut" isEqualToString:call.method]) { + [_camera zoomOut]; + result(nil); } else { NSDictionary *argsMap = call.arguments; NSUInteger textureId = ((NSNumber *)argsMap[@"textureId"]).unsignedIntegerValue; From ec61f54a2da8a59c95ea8ff5307e39ef963f5ac5 Mon Sep 17 00:00:00 2001 From: Ivan Kuz Date: Sun, 3 Nov 2019 18:25:32 +0400 Subject: [PATCH 3/6] return camera zoom changes --- .../io/flutter/plugins/camera/Camera.java | 63 +++++++++++++++++-- .../plugins/camera/MethodCallHandlerImpl.java | 20 ++++++ 2 files changed, 77 insertions(+), 6 deletions(-) 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..2c401815debd 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 @@ -1,12 +1,10 @@ package io.flutter.plugins.camera; -import static android.view.OrientationEventListener.ORIENTATION_UNKNOWN; -import static io.flutter.plugins.camera.CameraUtils.computeBestPreviewSize; - import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.graphics.ImageFormat; +import android.graphics.Rect; import android.graphics.SurfaceTexture; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCaptureSession; @@ -25,10 +23,9 @@ import android.util.Size; import android.view.OrientationEventListener; import android.view.Surface; + import androidx.annotation.NonNull; -import io.flutter.plugin.common.EventChannel; -import io.flutter.plugin.common.MethodChannel.Result; -import io.flutter.view.TextureRegistry.SurfaceTextureEntry; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -39,6 +36,13 @@ import java.util.List; import java.util.Map; +import io.flutter.plugin.common.EventChannel; +import io.flutter.plugin.common.MethodChannel.Result; +import io.flutter.view.TextureRegistry.SurfaceTextureEntry; + +import static android.view.OrientationEventListener.ORIENTATION_UNKNOWN; +import static io.flutter.plugins.camera.CameraUtils.computeBestPreviewSize; + public class Camera { private final SurfaceTextureEntry flutterTexture; private final CameraManager cameraManager; @@ -61,6 +65,10 @@ public class Camera { private CamcorderProfile recordingProfile; private int currentOrientation = ORIENTATION_UNKNOWN; + public float zoomLevel = 1f; + public Rect zoom; + protected CameraCharacteristics cameraCharacteristics; + // Mirrors camera.dart public enum ResolutionPreset { low, @@ -106,6 +114,8 @@ public void onOrientationChanged(int i) { characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); //noinspection ConstantConditions sensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); + cameraCharacteristics = characteristics; + //noinspection ConstantConditions isFrontFacing = characteristics.get(CameraCharacteristics.LENS_FACING) == CameraMetadata.LENS_FACING_FRONT; @@ -249,6 +259,7 @@ public void takePicture(String filePath, @NonNull final Result result) { cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); captureBuilder.addTarget(pictureImageReader.getSurface()); captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getMediaOrientation()); + setScalerCropRegion(captureBuilder, zoom); cameraCaptureSession.capture( captureBuilder.build(), @@ -320,6 +331,7 @@ public void onConfigured(@NonNull CameraCaptureSession session) { cameraCaptureSession = session; captureRequestBuilder.set( CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); + setScalerCropRegion(captureRequestBuilder, zoom); cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null); if (onSuccessCallback != null) { onSuccessCallback.run(); @@ -510,6 +522,45 @@ public void dispose() { orientationEventListener.disable(); } + public void zoomIn() throws CameraAccessException { + changeZoom(1); + } + + public void zoomOut() throws CameraAccessException { + changeZoom(-1); + } + + private void changeZoom(int step) throws CameraAccessException { + calculateZoom(step); + setScalerCropRegion(captureRequestBuilder, zoom); + cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null); + } + + private void calculateZoom(int step) { + zoomLevel += step; + + if (zoomLevel < 1f) { + zoomLevel = 1f; + return; + } + + Rect rect = cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE); + + float ratio = (float) 1 / zoomLevel; + int croppedWidth = rect.width() - Math.round((float) rect.width() * ratio); + int croppedHeight = rect.height() - Math.round((float) rect.height() * ratio); + zoom = + new Rect( + croppedWidth / 2, + croppedHeight / 2, + rect.width() - croppedWidth / 2, + rect.height() - croppedHeight / 2); + } + + private void setScalerCropRegion(CaptureRequest.Builder captureRequestBuilder, Rect zoom) { + captureRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoom); + } + private int getMediaOrientation() { final int sensorOrientationOffset = (currentOrientation == ORIENTATION_UNKNOWN) 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..94dd3c3f4d34 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 @@ -77,6 +77,26 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) camera.takePicture(call.argument("path"), result); break; } + case "zoomIn": + { + try { + camera.zoomIn(); + result.success(null); + } catch (CameraAccessException e) { + result.error("CameraAccess", e.getMessage(), null); + } + break; + } + case "zoomOut": + { + try { + camera.zoomOut(); + result.success(null); + } catch (CameraAccessException e) { + result.error("CameraAccess", e.getMessage(), null); + } + break; + } case "prepareForVideoRecording": { // This optimization is not required for Android. From cd3a82fcbeb74b4b8d791fb7a20de82882139524 Mon Sep 17 00:00:00 2001 From: Ivan Kuz Date: Sun, 3 Nov 2019 18:40:39 +0400 Subject: [PATCH 4/6] zoom by specific step --- .../io/flutter/plugins/camera/Camera.java | 10 ++--- .../plugins/camera/MethodCallHandlerImpl.java | 14 ++++++- packages/camera/ios/Classes/CameraPlugin.m | 38 +++++++++---------- packages/camera/lib/camera.dart | 8 ++++ 4 files changed, 40 insertions(+), 30 deletions(-) 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 2c401815debd..e016ffbd3072 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 @@ -66,7 +66,7 @@ public class Camera { private int currentOrientation = ORIENTATION_UNKNOWN; public float zoomLevel = 1f; - public Rect zoom; + private Rect zoom; protected CameraCharacteristics cameraCharacteristics; // Mirrors camera.dart @@ -522,12 +522,8 @@ public void dispose() { orientationEventListener.disable(); } - public void zoomIn() throws CameraAccessException { - changeZoom(1); - } - - public void zoomOut() throws CameraAccessException { - changeZoom(-1); + public void zoom(int step) throws CameraAccessException { + changeZoom(step); } private void changeZoom(int step) throws CameraAccessException { 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 94dd3c3f4d34..577a4d017aa8 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 @@ -77,10 +77,20 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) camera.takePicture(call.argument("path"), result); break; } + case "zoom": + { + try { + camera.zoom(call.argument("step")); + result.success(null); + } catch (CameraAccessException e) { + result.error("CameraAccess", e.getMessage(), null); + } + break; + } case "zoomIn": { try { - camera.zoomIn(); + camera.zoom(1); result.success(null); } catch (CameraAccessException e) { result.error("CameraAccess", e.getMessage(), null); @@ -90,7 +100,7 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) case "zoomOut": { try { - camera.zoomOut(); + camera.zoom(-1); result.success(null); } catch (CameraAccessException e) { result.error("CameraAccess", e.getMessage(), null); diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index 0909ceb759c8..55886a50ab36 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -206,8 +206,7 @@ - (void)stopVideoRecordingWithResult:(FlutterResult)result; - (void)startImageStreamWithMessenger:(NSObject *)messenger; - (void)stopImageStream; - (void)captureToFile:(NSString *)filename result:(FlutterResult)result; -- (void)zoonIn; -- (void)zoomOut; +- (void)zoom:(NSUInteger *) step; @end @implementation FLTCam { @@ -277,24 +276,17 @@ - (void)stop { [_captureSession stopRunning]; } -- (void)zoomIn { - _zoom++; - [_captureDevice lockForConfiguration:NULL]; - [_captureDevice setVideoZoomFactor:_zoom]; - [_captureDevice unlockForConfiguration]; -} +- (void)zoom:(NSUInteger *)step { + _zoom += step; -- (void)zoomOut { - _zoom--; - - if (_zoom < 1) { - _zoom = 1; - return; - } - - [_captureDevice lockForConfiguration:NULL]; - [_captureDevice setVideoZoomFactor:_zoom]; - [_captureDevice unlockForConfiguration]; + if (_zoom < 1) { + _zoom = 1; + return; + } + + [_captureDevice lockForConfiguration:NULL]; + [_captureDevice setVideoZoomFactor:_zoom]; + [_captureDevice unlockForConfiguration]; } - (void)captureToFile:(NSString *)path result:(FlutterResult)result { @@ -897,10 +889,14 @@ - (void)handleMethodCallAsync:(FlutterMethodCall *)call result:(FlutterResult)re [_camera stopImageStream]; result(nil); } else if ([@"zoomIn" isEqualToString:call.method]) { - [_camera zoomIn]; + [_camera zoom:1]; result(nil); } else if ([@"zoomOut" isEqualToString:call.method]) { - [_camera zoomOut]; + [_camera zoom:-1]; + result(nil); + } else if ([@"zoom" isEqualToString:call.method]) { + NSUInteger step = ((NSNumber *)argsMap[@"step"]).unsignedIntegerValue; + [_camera zoom:step]; result(nil); } else if ([@"pauseVideoRecording" isEqualToString:call.method]) { [_camera pauseVideoRecording]; diff --git a/packages/camera/lib/camera.dart b/packages/camera/lib/camera.dart index cd1136c8628f..1411ab6f0422 100644 --- a/packages/camera/lib/camera.dart +++ b/packages/camera/lib/camera.dart @@ -590,6 +590,14 @@ class CameraController extends ValueNotifier { await _channel.invokeMethod('zoomIn'); } + /// + /// change zoom by specific [step]. + /// with a negative step, the zoom will be 1 + /// + Future zoom(int step) async { + await _channel.invokeMethod('zoom', {'step': step}); + } + Future zoomOut() async { await _channel.invokeMethod('zoomOut'); } From 2356f86abfcc8096f816a1d83f0022da6131b634 Mon Sep 17 00:00:00 2001 From: Ivan Kuz Date: Sun, 3 Nov 2019 18:45:19 +0400 Subject: [PATCH 5/6] version --- packages/camera/CHANGELOG.md | 4 ++++ packages/camera/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/camera/CHANGELOG.md b/packages/camera/CHANGELOG.md index 8a3f248433eb..2411c10c8a98 100644 --- a/packages/camera/CHANGELOG.md +++ b/packages/camera/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.7 + +* Add zoom feature. + ## 0.5.6+4 * Android: Use CameraDevice.TEMPLATE_RECORD to improve image streaming. diff --git a/packages/camera/pubspec.yaml b/packages/camera/pubspec.yaml index aae2d6e9112b..431e3344f6da 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.6+3 +version: 0.5.7 authors: - Flutter Team From afc9bd8e0bd4c1953066dfcd6712839f42b0d31f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=D0=9A=D1=83=D0=B7=D0=BD=D0=B5=D1=86=D0=BE=D0=B2?= Date: Sun, 3 Nov 2019 07:01:42 -0800 Subject: [PATCH 6/6] code formatting --- .../io/flutter/plugins/camera/Camera.java | 25 +++++----- .../flutter/plugins/camera/CameraPlugin.java | 30 ++++++------ .../plugins/camera/MethodCallHandlerImpl.java | 48 +++++++++---------- packages/camera/example/lib/main.dart | 9 ++-- packages/camera/ios/Classes/CameraPlugin.m | 34 ++++++------- packages/camera/lib/camera.dart | 2 +- .../ios/Classes/ConnectivityPlugin.m | 4 +- 7 files changed, 74 insertions(+), 78 deletions(-) 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 e016ffbd3072..947a2e316213 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 @@ -1,5 +1,8 @@ package io.flutter.plugins.camera; +import static android.view.OrientationEventListener.ORIENTATION_UNKNOWN; +import static io.flutter.plugins.camera.CameraUtils.computeBestPreviewSize; + import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; @@ -23,9 +26,10 @@ import android.util.Size; import android.view.OrientationEventListener; import android.view.Surface; - import androidx.annotation.NonNull; - +import io.flutter.plugin.common.EventChannel; +import io.flutter.plugin.common.MethodChannel.Result; +import io.flutter.view.TextureRegistry.SurfaceTextureEntry; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -36,13 +40,6 @@ import java.util.List; import java.util.Map; -import io.flutter.plugin.common.EventChannel; -import io.flutter.plugin.common.MethodChannel.Result; -import io.flutter.view.TextureRegistry.SurfaceTextureEntry; - -import static android.view.OrientationEventListener.ORIENTATION_UNKNOWN; -import static io.flutter.plugins.camera.CameraUtils.computeBestPreviewSize; - public class Camera { private final SurfaceTextureEntry flutterTexture; private final CameraManager cameraManager; @@ -546,11 +543,11 @@ private void calculateZoom(int step) { int croppedWidth = rect.width() - Math.round((float) rect.width() * ratio); int croppedHeight = rect.height() - Math.round((float) rect.height() * ratio); zoom = - new Rect( - croppedWidth / 2, - croppedHeight / 2, - rect.width() - croppedWidth / 2, - rect.height() - croppedHeight / 2); + new Rect( + croppedWidth / 2, + croppedHeight / 2, + rect.width() - croppedWidth / 2, + rect.height() - croppedHeight / 2); } private void setScalerCropRegion(CaptureRequest.Builder captureRequestBuilder, Rect zoom) { 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 dbacd09827ab..9bd34e17aa02 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 @@ -48,10 +48,10 @@ public CameraPlugin() {} public static void registerWith(Registrar registrar) { CameraPlugin plugin = new CameraPlugin(); plugin.maybeStartListening( - registrar.activity(), - registrar.messenger(), - registrar::addRequestPermissionsResultListener, - registrar.view()); + registrar.activity(), + registrar.messenger(), + registrar::addRequestPermissionsResultListener, + registrar.view()); } @Override @@ -67,10 +67,10 @@ public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { @Override public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) { maybeStartListening( - binding.getActivity(), - flutterPluginBinding.getFlutterEngine().getDartExecutor(), - binding::addRequestPermissionsResultListener, - flutterPluginBinding.getFlutterEngine().getRenderer()); + binding.getActivity(), + flutterPluginBinding.getFlutterEngine().getDartExecutor(), + binding::addRequestPermissionsResultListener, + flutterPluginBinding.getFlutterEngine().getRenderer()); } @Override @@ -95,17 +95,17 @@ public void onDetachedFromActivityForConfigChanges() { } private void maybeStartListening( - Activity activity, - BinaryMessenger messenger, - PermissionsRegistry permissionsRegistry, - TextureRegistry textureRegistry) { + Activity activity, + BinaryMessenger messenger, + PermissionsRegistry permissionsRegistry, + TextureRegistry textureRegistry) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { // If the sdk is less than 21 (min sdk for Camera2) we don't register the plugin. return; } methodCallHandler = - new MethodCallHandlerImpl( - activity, messenger, new CameraPermissions(), permissionsRegistry, textureRegistry); + new MethodCallHandlerImpl( + activity, messenger, new CameraPermissions(), permissionsRegistry, textureRegistry); } -} \ No newline at end of file +} 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 577a4d017aa8..4567e372a3d5 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 @@ -78,35 +78,35 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) break; } case "zoom": - { - try { - camera.zoom(call.argument("step")); - result.success(null); - } catch (CameraAccessException e) { - result.error("CameraAccess", e.getMessage(), null); + { + try { + camera.zoom(call.argument("step")); + result.success(null); + } catch (CameraAccessException e) { + result.error("CameraAccess", e.getMessage(), null); + } + break; } - break; - } case "zoomIn": - { - try { - camera.zoom(1); - result.success(null); - } catch (CameraAccessException e) { - result.error("CameraAccess", e.getMessage(), null); + { + try { + camera.zoom(1); + result.success(null); + } catch (CameraAccessException e) { + result.error("CameraAccess", e.getMessage(), null); + } + break; } - break; - } case "zoomOut": - { - try { - camera.zoom(-1); - result.success(null); - } catch (CameraAccessException e) { - result.error("CameraAccess", e.getMessage(), null); + { + try { + camera.zoom(-1); + result.success(null); + } catch (CameraAccessException e) { + result.error("CameraAccess", e.getMessage(), null); + } + break; } - break; - } case "prepareForVideoRecording": { // This optimization is not required for Android. diff --git a/packages/camera/example/lib/main.dart b/packages/camera/example/lib/main.dart index 844e9aa74b8c..5ec7739993ec 100644 --- a/packages/camera/example/lib/main.dart +++ b/packages/camera/example/lib/main.dart @@ -239,16 +239,12 @@ class _CameraExampleHomeState extends State IconButton( icon: const Icon(Icons.zoom_in), color: Colors.blue, - onPressed: controller != null - ? onZoomInButtonPressed - : null, + onPressed: controller != null ? onZoomInButtonPressed : null, ), IconButton( icon: const Icon(Icons.zoom_out), color: Colors.blue, - onPressed: controller != null - ? onZoomOutButtonPressed - : null, + onPressed: controller != null ? onZoomOutButtonPressed : null, ), ], ); @@ -356,6 +352,7 @@ class _CameraExampleHomeState extends State } controller.zoomOut(); } + void onPauseButtonPressed() { pauseVideoRecording().then((_) { if (mounted) setState(() {}); diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index 55886a50ab36..08a5cb32ef91 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -206,7 +206,7 @@ - (void)stopVideoRecordingWithResult:(FlutterResult)result; - (void)startImageStreamWithMessenger:(NSObject *)messenger; - (void)stopImageStream; - (void)captureToFile:(NSString *)filename result:(FlutterResult)result; -- (void)zoom:(NSUInteger *) step; +- (void)zoom:(NSUInteger *)step; @end @implementation FLTCam { @@ -222,7 +222,7 @@ - (instancetype)initWithCameraName:(NSString *)cameraName error:(NSError **)error { self = [super init]; _zoom = 1; - + NSAssert(self, @"super init cannot be nil"); @try { _resolutionPreset = getResolutionPresetForString(resolutionPreset); @@ -277,16 +277,16 @@ - (void)stop { } - (void)zoom:(NSUInteger *)step { - _zoom += step; + _zoom += step; - if (_zoom < 1) { - _zoom = 1; - return; - } + if (_zoom < 1) { + _zoom = 1; + return; + } - [_captureDevice lockForConfiguration:NULL]; - [_captureDevice setVideoZoomFactor:_zoom]; - [_captureDevice unlockForConfiguration]; + [_captureDevice lockForConfiguration:NULL]; + [_captureDevice setVideoZoomFactor:_zoom]; + [_captureDevice unlockForConfiguration]; } - (void)captureToFile:(NSString *)path result:(FlutterResult)result { @@ -889,15 +889,15 @@ - (void)handleMethodCallAsync:(FlutterMethodCall *)call result:(FlutterResult)re [_camera stopImageStream]; result(nil); } else if ([@"zoomIn" isEqualToString:call.method]) { - [_camera zoom:1]; - result(nil); + [_camera zoom:1]; + result(nil); } else if ([@"zoomOut" isEqualToString:call.method]) { [_camera zoom:-1]; - result(nil); - } else if ([@"zoom" isEqualToString:call.method]) { - NSUInteger step = ((NSNumber *)argsMap[@"step"]).unsignedIntegerValue; - [_camera zoom:step]; - result(nil); + result(nil); + } else if ([@"zoom" isEqualToString:call.method]) { + NSUInteger step = ((NSNumber *)call.arguments[@"step"]).unsignedIntegerValue; + [_camera zoom:step]; + result(nil); } else if ([@"pauseVideoRecording" isEqualToString:call.method]) { [_camera pauseVideoRecording]; result(nil); diff --git a/packages/camera/lib/camera.dart b/packages/camera/lib/camera.dart index 1411ab6f0422..687e72f127fc 100644 --- a/packages/camera/lib/camera.dart +++ b/packages/camera/lib/camera.dart @@ -587,7 +587,7 @@ class CameraController extends ValueNotifier { } Future zoomIn() async { - await _channel.invokeMethod('zoomIn'); + await _channel.invokeMethod('zoomIn'); } /// diff --git a/packages/connectivity/ios/Classes/ConnectivityPlugin.m b/packages/connectivity/ios/Classes/ConnectivityPlugin.m index c69871175b01..346e5f1777e2 100644 --- a/packages/connectivity/ios/Classes/ConnectivityPlugin.m +++ b/packages/connectivity/ios/Classes/ConnectivityPlugin.m @@ -155,7 +155,9 @@ - (NSString*)convertCLAuthorizationStatusToString:(CLAuthorizationStatus)status case kCLAuthorizationStatusAuthorizedWhenInUse: { return @"authorizedWhenInUse"; } - default: { return @"unknown"; } + default: { + return @"unknown"; + } } }