This is an automated email from the ASF dual-hosted git repository.

GitToTheHub pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cordova-plugin-camera.git


The following commit(s) were added to refs/heads/master by this push:
     new 8f30bf4  feat: add stop API to close active camera or media picker 
(#873)
8f30bf4 is described below

commit 8f30bf4efa0d9ba4bdbfe81ce19fc0c52ad9a17e
Author: Nitya Santosh <[email protected]>
AuthorDate: Thu Jul 30 12:39:07 2026 +0530

    feat: add stop API to close active camera or media picker (#873)
    
    - document stop API in README
    - add stop to TypeScript definitions
    - Generated-By: GPT-5.3-Codex
    
    ---------
    
    Co-authored-by: Nitya Santosh <[email protected]>
    Co-authored-by: Manuel Beck <[email protected]>
---
 README.md                       | 26 ++++++++++++++++++++++++++
 src/android/CameraLauncher.java | 26 ++++++++++++++++++++++++--
 src/ios/CDVCamera.h             |  1 +
 src/ios/CDVCamera.m             | 20 ++++++++++++++++++++
 types/index.d.ts                |  8 ++++++++
 www/Camera.js                   | 12 ++++++++++++
 6 files changed, 91 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 2601553..51db739 100644
--- a/README.md
+++ b/README.md
@@ -169,6 +169,7 @@ To add these entries into the `info.plist`, you can use the 
`edit-config` tag in
 
 - [camera](#module_camera)
   - [.getPicture(successCallback, errorCallback, 
options)](#module_camera.getPicture)
+    - [.stop()](#module_camera.stop)
   - [.cleanup()](#module_camera.cleanup)
   - [.onError](#module_camera.onError) : <code>function</code>
   - [.onSuccess](#module_camera.onSuccess) : <code>function</code>
@@ -273,6 +274,31 @@ More examples [here](#camera-getPicture-examples). Quirks 
[here](#camera-getPict
 ```js
 navigator.camera.getPicture(cameraSuccess, cameraError, cameraOptions);
 ```
+
+<a name="module_camera.stop"></a>
+
+### camera.stop()
+Closes the active camera or photo library picker UI.
+
+__Supported Platforms__
+
+- Android
+- iOS
+
+**Kind**: static method of <code>[camera](#module_camera)</code>
+**Example**
+```js
+navigator.camera.stop(onSuccess, onFail);
+
+function onSuccess() {
+    console.log('Camera stopped successfully.');
+}
+
+function onFail(message) {
+    alert('Failed because: ' + message);
+}
+```
+
 <a name="module_camera.cleanup"></a>
 
 ### camera.cleanup()
diff --git a/src/android/CameraLauncher.java b/src/android/CameraLauncher.java
index af03a9c..ce6ca2e 100644
--- a/src/android/CameraLauncher.java
+++ b/src/android/CameraLauncher.java
@@ -102,6 +102,7 @@ public class CameraLauncher extends CordovaPlugin 
implements MediaScannerConnect
     private static final String IMAGE_URI_KEY = "imageUri";
 
     private static final String TAKE_PICTURE_ACTION = "takePicture";
+    private static final String STOP_ACTION = "stop";
 
     public static final int PERMISSION_DENIED_ERROR = 20;
     public static final int TAKE_PIC_SEC = 0;
@@ -146,12 +147,11 @@ public class CameraLauncher extends CordovaPlugin 
implements MediaScannerConnect
      * @return                  A PluginResult object with a status and 
message.
      */
     public boolean execute(String action, JSONArray args, CallbackContext 
callbackContext) throws JSONException {
-        this.callbackContext = callbackContext;
-
         this.applicationId = cordova.getContext().getPackageName();
         this.applicationId = preferences.getString("applicationId", 
this.applicationId);
 
         if (action.equals(TAKE_PICTURE_ACTION)) {
+            this.callbackContext = callbackContext;
             this.srcType = CAMERA;
             this.destType = FILE_URI;
             this.saveToPhotoAlbum = false;
@@ -216,6 +216,10 @@ public class CameraLauncher extends CordovaPlugin 
implements MediaScannerConnect
             r.setKeepCallback(true);
             callbackContext.sendPluginResult(r);
 
+            return true;
+        } else if (action.equals(STOP_ACTION)) {
+            this.stopCamera();
+            callbackContext.success();
             return true;
         }
         return false;
@@ -307,6 +311,24 @@ public class CameraLauncher extends CordovaPlugin 
implements MediaScannerConnect
         }
     }
 
+    /**
+     * Closes any active camera or media picker activity started by this 
plugin.
+     */
+    public void stopCamera() {
+        if (this.cordova == null || this.cordova.getActivity() == null) {
+            return;
+        }
+
+        int[] sourceTypes = { CAMERA, PHOTOLIBRARY, SAVEDPHOTOALBUM };
+        int[] returnTypes = { DATA_URL, FILE_URI };
+
+        for (int sourceType : sourceTypes) {
+            for (int returnType : returnTypes) {
+                this.cordova.getActivity().finishActivity((sourceType + 1) * 
16 + returnType + 1);
+            }
+        }
+    }
+
     public void takePicture(int returnType, int encodingType)
     {
         // Let's use the intent and see what happens
diff --git a/src/ios/CDVCamera.h b/src/ios/CDVCamera.h
index 63c9b86..48bd907 100644
--- a/src/ios/CDVCamera.h
+++ b/src/ios/CDVCamera.h
@@ -121,6 +121,7 @@ typedef NSUInteger CDVMediaType;
 
 - (void)takePicture:(CDVInvokedUrlCommand*)command;
 - (void)cleanup:(CDVInvokedUrlCommand*)command;
+- (void)stop:(CDVInvokedUrlCommand*)command;
 
 // UIImagePickerControllerDelegate methods
 - (void)imagePickerController:(UIImagePickerController*)picker 
didFinishPickingMediaWithInfo:(NSDictionary*)info;
diff --git a/src/ios/CDVCamera.m b/src/ios/CDVCamera.m
index 72bbd03..c94b5ae 100644
--- a/src/ios/CDVCamera.m
+++ b/src/ios/CDVCamera.m
@@ -233,6 +233,26 @@ static NSString* MIME_JPEG    = @"image/jpeg";
     });
 }
 
+- (void)stop:(CDVInvokedUrlCommand*)command
+{
+    dispatch_async(dispatch_get_main_queue(), ^{
+        UIViewController* presentedViewController = 
self.viewController.presentedViewController;
+        if (presentedViewController == nil) {
+            CDVPluginResult* result = [CDVPluginResult 
resultWithStatus:CDVCommandStatus_OK];
+            [self.commandDelegate sendPluginResult:result 
callbackId:command.callbackId];
+            return;
+        }
+
+        [presentedViewController dismissViewControllerAnimated:YES 
completion:^{
+            self.hasPendingOperation = NO;
+            self.cdvUIImagePickerController = nil;
+
+            CDVPluginResult* result = [CDVPluginResult 
resultWithStatus:CDVCommandStatus_OK];
+            [self.commandDelegate sendPluginResult:result 
callbackId:command.callbackId];
+        }];
+    });
+}
+
 - (void)sendNoPermissionResult:(NSString*)callbackId
 {
     CDVPluginResult* result = [CDVPluginResult 
resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"has no access to 
camera"];   // error callback expects string ATM
diff --git a/types/index.d.ts b/types/index.d.ts
index 4fe7788..7f87241 100644
--- a/types/index.d.ts
+++ b/types/index.d.ts
@@ -17,6 +17,14 @@ interface Navigator {
  * This plugin provides an API for taking pictures and for choosing images 
from the system's image library.
  */
 interface Camera {
+    /**
+     * Closes the active camera or photo library picker UI.
+     * @param onSuccess Success callback, that called when stop succeeds.
+     * @param onError Error callback, that get an error message.
+     */
+    stop(
+        onSuccess: () => void,
+        onError: (message: string) => void): void;
     /**
      * Removes intermediate photos taken by the camera from temporary storage.
      * @param onSuccess Success callback, that called when cleanup succeeds.
diff --git a/www/Camera.js b/www/Camera.js
index d6ced51..3d340b0 100644
--- a/www/Camera.js
+++ b/www/Camera.js
@@ -147,6 +147,18 @@ cameraExport.getPicture = function (successCallback, 
errorCallback, options) {
     exec(successCallback, errorCallback, 'Camera', 'takePicture', args);
 };
 
+/**
+ * Closes the active camera or media picker UI.
+ *
+ * __Supported Platforms__
+ *
+ * - Android
+ * - iOS
+ */
+cameraExport.stop = function (successCallback, errorCallback) {
+    exec(successCallback, errorCallback, 'Camera', 'stop', []);
+};
+
 /**
  * Removes intermediate image files that are kept in temporary storage
  * after calling [`camera.getPicture`]{@link module:camera.getPicture}. 
Applies only when the value of


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to