From 1bcf8577a4b69428240d0491a604f60167bd5572 Mon Sep 17 00:00:00 2001 From: Christian Brevik Date: Sun, 27 Aug 2017 14:45:47 +0200 Subject: [PATCH 1/2] Add start/stopPreview for Camera --- README.md | 8 +++++++ .../RCTCamera/RCTCameraModule.java | 12 ++++++++++ index.js | 22 +++++++++++++++++++ ios/RCTCameraManager.m | 22 +++++++++++++++++++ 4 files changed, 64 insertions(+) diff --git a/README.md b/README.md index e4e7d09..f780c52 100644 --- a/README.md +++ b/README.md @@ -346,6 +346,14 @@ Returns whether or not the camera has flash capabilities. Ends the current capture session for video captures. Only applies when the current `captureMode` is `video`. +#### `stopPreview()` + +Stops the camera preview from running, and natively will make the current capture session pause. + +#### `startPreview()` + +Starts the camera preview again if previously stopped. + ## Component static methods #### `iOS` `Camera.checkDeviceAuthorizationStatus(): Promise` diff --git a/android/src/main/java/com/lwansbrough/RCTCamera/RCTCameraModule.java b/android/src/main/java/com/lwansbrough/RCTCamera/RCTCameraModule.java index 10b59f9..1089273 100644 --- a/android/src/main/java/com/lwansbrough/RCTCamera/RCTCameraModule.java +++ b/android/src/main/java/com/lwansbrough/RCTCamera/RCTCameraModule.java @@ -658,6 +658,18 @@ public class RCTCameraModule extends ReactContextBaseJavaModule } } + @ReactMethod + public void stopPreview(ReadableMap options) { + Camera camera = RCTCamera.getInstance().acquireCameraInstance(options.getInt("type")); + camera.stopPreview(); + } + + @ReactMethod + public void startPreview(ReadableMap options) { + Camera camera = RCTCamera.getInstance().acquireCameraInstance(options.getInt("type")); + camera.startPreview(); + } + @ReactMethod public void hasFlash(ReadableMap options, final Promise promise) { Camera camera = RCTCamera.getInstance().acquireCameraInstance(options.getInt("type")); diff --git a/index.js b/index.js index f1957e9..8e1d059 100644 --- a/index.js +++ b/index.js @@ -236,6 +236,28 @@ export default class Camera extends Component { return CameraManager.capture(options); } + startPreview() { + if (Platform.OS === 'android') { + const props = convertNativeProps(this.props); + CameraManager.startPreview({ + type: props.type + }); + } else { + CameraManager.startPreview(); + } + } + + stopPreview() { + if (Platform.OS === 'android') { + const props = convertNativeProps(this.props); + CameraManager.stopPreview({ + type: props.type + }); + } else { + CameraManager.stopPreview(); + } + } + stopCapture() { if (this.state.isRecording) { this.setState({ isRecording: false }); diff --git a/ios/RCTCameraManager.m b/ios/RCTCameraManager.m index 2310080..ea6d355 100644 --- a/ios/RCTCameraManager.m +++ b/ios/RCTCameraManager.m @@ -374,6 +374,28 @@ RCT_EXPORT_METHOD(capture:(NSDictionary *)options } } +RCT_EXPORT_METHOD(stopPreview) { +#if TARGET_IPHONE_SIMULATOR + return; +#endif + dispatch_async(self.sessionQueue, ^{ + if ([self.session isRunning]) { + [self.session stopRunning]; + } + }); +} + +RCT_EXPORT_METHOD(startPreview) { +#if TARGET_IPHONE_SIMULATOR + return; +#endif + dispatch_async(self.sessionQueue, ^{ + if (![self.session isRunning]) { + [self.session startRunning]; + } + }); +} + RCT_EXPORT_METHOD(stopCapture) { if (self.movieFileOutput.recording) { [self.movieFileOutput stopRecording]; From 4e04e3484b272e0bb3486907a21c9d46947ab7c9 Mon Sep 17 00:00:00 2001 From: Christian Brevik Date: Tue, 29 Aug 2017 14:35:35 +0200 Subject: [PATCH 2/2] Make safer calls on Android --- .../com/lwansbrough/RCTCamera/RCTCameraModule.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/lwansbrough/RCTCamera/RCTCameraModule.java b/android/src/main/java/com/lwansbrough/RCTCamera/RCTCameraModule.java index 1089273..fe88bf1 100644 --- a/android/src/main/java/com/lwansbrough/RCTCamera/RCTCameraModule.java +++ b/android/src/main/java/com/lwansbrough/RCTCamera/RCTCameraModule.java @@ -660,13 +660,23 @@ public class RCTCameraModule extends ReactContextBaseJavaModule @ReactMethod public void stopPreview(ReadableMap options) { - Camera camera = RCTCamera.getInstance().acquireCameraInstance(options.getInt("type")); + RCTCamera instance = RCTCamera.getInstance(); + if (instance == null) return; + + Camera camera = instance.acquireCameraInstance(options.getInt("type")); + if (camera == null) return; + camera.stopPreview(); } @ReactMethod public void startPreview(ReadableMap options) { - Camera camera = RCTCamera.getInstance().acquireCameraInstance(options.getInt("type")); + RCTCamera instance = RCTCamera.getInstance(); + if (instance == null) return; + + Camera camera = instance.acquireCameraInstance(options.getInt("type")); + if (camera == null) return; + camera.startPreview(); }