@carviz/capacitor-camera-preview 7.0.3 → 7.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/com/ahm/capacitor/camera/preview/CameraActivity.java +123 -0
- package/android/src/main/java/com/ahm/capacitor/camera/preview/CameraPreview.java +49 -1
- package/dist/esm/definitions.d.ts +19 -1
- package/dist/esm/web.d.ts +6 -1
- package/dist/esm/web.js +12 -0
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +12 -0
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +12 -0
- package/dist/plugin.js.map +1 -1
- package/ios/Plugin/CameraController.swift +63 -2
- package/ios/Plugin/Plugin.m +2 -0
- package/ios/Plugin/Plugin.swift +55 -1
- package/package.json +2 -2
|
@@ -47,7 +47,12 @@ public class CameraActivity extends Fragment {
|
|
|
47
47
|
void onCameraStarted();
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
public interface ZoomChangeListener {
|
|
51
|
+
void onZoomChanged(float zoomLevel);
|
|
52
|
+
}
|
|
53
|
+
|
|
50
54
|
private CameraPreviewListener eventListener;
|
|
55
|
+
private ZoomChangeListener zoomChangeListener;
|
|
51
56
|
private static final String TAG = "CameraActivity";
|
|
52
57
|
public FrameLayout mainLayout;
|
|
53
58
|
public FrameLayout frameContainerLayout;
|
|
@@ -91,6 +96,10 @@ public class CameraActivity extends Fragment {
|
|
|
91
96
|
eventListener = listener;
|
|
92
97
|
}
|
|
93
98
|
|
|
99
|
+
public void setZoomChangeListener(ZoomChangeListener listener) {
|
|
100
|
+
zoomChangeListener = listener;
|
|
101
|
+
}
|
|
102
|
+
|
|
94
103
|
private String appResourcesPackage;
|
|
95
104
|
|
|
96
105
|
@Override
|
|
@@ -281,6 +290,13 @@ public class CameraActivity extends Fragment {
|
|
|
281
290
|
mDist = newDist;
|
|
282
291
|
params.setZoom(zoom);
|
|
283
292
|
mCamera.setParameters(params);
|
|
293
|
+
|
|
294
|
+
// Notify listener of zoom change during pinch
|
|
295
|
+
if (zoomChangeListener != null) {
|
|
296
|
+
// Convert zoom index back to zoom level for consistency
|
|
297
|
+
float zoomLevel = 1.0f + (zoom * (getMaxZoomLevel() - 1.0f) / maxZoom);
|
|
298
|
+
zoomChangeListener.onZoomChanged(zoomLevel);
|
|
299
|
+
}
|
|
284
300
|
}
|
|
285
301
|
}
|
|
286
302
|
}
|
|
@@ -828,4 +844,111 @@ public class CameraActivity extends Fragment {
|
|
|
828
844
|
float y = event.getY(0) - event.getY(1);
|
|
829
845
|
return (float) Math.sqrt(x * x + y * y);
|
|
830
846
|
}
|
|
847
|
+
|
|
848
|
+
/**
|
|
849
|
+
* Set the zoom level of the camera
|
|
850
|
+
* @param zoomLevel The zoom level to set (1.0 = no zoom, higher values = more zoom)
|
|
851
|
+
* @return true if zoom was set successfully, false otherwise
|
|
852
|
+
*/
|
|
853
|
+
public boolean setZoom(float zoomLevel) {
|
|
854
|
+
if (mCamera == null) {
|
|
855
|
+
Log.e(TAG, "Camera is null, cannot set zoom");
|
|
856
|
+
return false;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
try {
|
|
860
|
+
Camera.Parameters params = mCamera.getParameters();
|
|
861
|
+
if (!params.isZoomSupported()) {
|
|
862
|
+
Log.e(TAG, "Zoom is not supported on this device");
|
|
863
|
+
return false;
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
int maxZoom = params.getMaxZoom();
|
|
867
|
+
|
|
868
|
+
// Convert zoom level (1.0-based) to zoom index (0-based)
|
|
869
|
+
// Zoom level 1.0 = zoom index 0 (no zoom)
|
|
870
|
+
// Higher zoom levels map proportionally to the max zoom index
|
|
871
|
+
int zoomIndex;
|
|
872
|
+
if (zoomLevel <= 1.0f) {
|
|
873
|
+
zoomIndex = 0;
|
|
874
|
+
} else {
|
|
875
|
+
// Map zoom level linearly to zoom index range
|
|
876
|
+
zoomIndex = Math.round((zoomLevel - 1.0f) * maxZoom / (getMaxZoomLevel() - 1.0f));
|
|
877
|
+
zoomIndex = Math.min(zoomIndex, maxZoom);
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
params.setZoom(zoomIndex);
|
|
881
|
+
mCamera.setParameters(params);
|
|
882
|
+
|
|
883
|
+
Log.d(TAG, "Zoom set to level: " + zoomLevel + " (index: " + zoomIndex + ")");
|
|
884
|
+
|
|
885
|
+
// Notify listener of zoom change
|
|
886
|
+
if (zoomChangeListener != null) {
|
|
887
|
+
zoomChangeListener.onZoomChanged(zoomLevel);
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
return true;
|
|
891
|
+
} catch (Exception e) {
|
|
892
|
+
Log.e(TAG, "Error setting zoom: " + e.getMessage());
|
|
893
|
+
return false;
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
/**
|
|
898
|
+
* Get the current zoom level of the camera
|
|
899
|
+
* @return The current zoom level (1.0 = no zoom, higher values = more zoom)
|
|
900
|
+
*/
|
|
901
|
+
public float getZoom() {
|
|
902
|
+
if (mCamera == null) {
|
|
903
|
+
Log.e(TAG, "Camera is null, cannot get zoom");
|
|
904
|
+
return 1.0f;
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
try {
|
|
908
|
+
Camera.Parameters params = mCamera.getParameters();
|
|
909
|
+
if (!params.isZoomSupported()) {
|
|
910
|
+
Log.d(TAG, "Zoom is not supported on this device");
|
|
911
|
+
return 1.0f;
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
int currentZoomIndex = params.getZoom();
|
|
915
|
+
int maxZoom = params.getMaxZoom();
|
|
916
|
+
|
|
917
|
+
// Convert zoom index (0-based) to zoom level (1.0-based)
|
|
918
|
+
if (currentZoomIndex == 0) {
|
|
919
|
+
return 1.0f;
|
|
920
|
+
} else {
|
|
921
|
+
// Map zoom index linearly to zoom level range
|
|
922
|
+
float zoomLevel = 1.0f + (currentZoomIndex * (getMaxZoomLevel() - 1.0f) / maxZoom);
|
|
923
|
+
return zoomLevel;
|
|
924
|
+
}
|
|
925
|
+
} catch (Exception e) {
|
|
926
|
+
Log.e(TAG, "Error getting zoom: " + e.getMessage());
|
|
927
|
+
return 1.0f;
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
/**
|
|
932
|
+
* Get the maximum zoom level supported by the camera
|
|
933
|
+
* @return The maximum zoom level
|
|
934
|
+
*/
|
|
935
|
+
private float getMaxZoomLevel() {
|
|
936
|
+
if (mCamera == null) {
|
|
937
|
+
return 1.0f;
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
try {
|
|
941
|
+
Camera.Parameters params = mCamera.getParameters();
|
|
942
|
+
if (!params.isZoomSupported()) {
|
|
943
|
+
return 1.0f;
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
// Most Android cameras support up to 10x zoom, but we'll use a reasonable default
|
|
947
|
+
// This can be adjusted based on specific device capabilities
|
|
948
|
+
return 10.0f;
|
|
949
|
+
} catch (Exception e) {
|
|
950
|
+
Log.e(TAG, "Error getting max zoom level: " + e.getMessage());
|
|
951
|
+
return 1.0f;
|
|
952
|
+
}
|
|
953
|
+
}
|
|
831
954
|
}
|
|
@@ -28,7 +28,7 @@ import java.util.List;
|
|
|
28
28
|
import org.json.JSONArray;
|
|
29
29
|
|
|
30
30
|
@CapacitorPlugin(name = "CameraPreview", permissions = { @Permission(strings = { CAMERA }, alias = CameraPreview.CAMERA_PERMISSION_ALIAS) })
|
|
31
|
-
public class CameraPreview extends Plugin implements CameraActivity.CameraPreviewListener {
|
|
31
|
+
public class CameraPreview extends Plugin implements CameraActivity.CameraPreviewListener, CameraActivity.ZoomChangeListener {
|
|
32
32
|
|
|
33
33
|
static final String CAMERA_PERMISSION_ALIAS = "camera";
|
|
34
34
|
|
|
@@ -188,6 +188,46 @@ public class CameraPreview extends Plugin implements CameraActivity.CameraPrevie
|
|
|
188
188
|
call.resolve();
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
+
@PluginMethod
|
|
192
|
+
public void setZoom(PluginCall call) {
|
|
193
|
+
if (!this.hasCamera(call)) {
|
|
194
|
+
call.reject("Camera is not running");
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
Double zoomValue = call.getDouble("zoom");
|
|
199
|
+
if (zoomValue == null) {
|
|
200
|
+
call.reject("zoom parameter is missing");
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
float zoomLevel = zoomValue.floatValue();
|
|
205
|
+
if (zoomLevel < 1.0f) {
|
|
206
|
+
call.reject("zoom level must be >= 1.0");
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
boolean success = fragment.setZoom(zoomLevel);
|
|
211
|
+
if (success) {
|
|
212
|
+
call.resolve();
|
|
213
|
+
} else {
|
|
214
|
+
call.reject("Failed to set zoom level");
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
@PluginMethod
|
|
219
|
+
public void getZoom(PluginCall call) {
|
|
220
|
+
if (!this.hasCamera(call)) {
|
|
221
|
+
call.reject("Camera is not running");
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
float currentZoom = fragment.getZoom();
|
|
226
|
+
JSObject result = new JSObject();
|
|
227
|
+
result.put("zoom", currentZoom);
|
|
228
|
+
call.resolve(result);
|
|
229
|
+
}
|
|
230
|
+
|
|
191
231
|
@PermissionCallback
|
|
192
232
|
private void handleCameraPermissionResult(PluginCall call) {
|
|
193
233
|
if (PermissionState.GRANTED.equals(getPermissionState(CAMERA_PERMISSION_ALIAS))) {
|
|
@@ -231,6 +271,7 @@ public class CameraPreview extends Plugin implements CameraActivity.CameraPrevie
|
|
|
231
271
|
fragment.toBack = toBack;
|
|
232
272
|
fragment.enableOpacity = enableOpacity;
|
|
233
273
|
fragment.enableZoom = enableZoom;
|
|
274
|
+
fragment.setZoomChangeListener(this);
|
|
234
275
|
|
|
235
276
|
bridge
|
|
236
277
|
.getActivity()
|
|
@@ -355,6 +396,13 @@ public class CameraPreview extends Plugin implements CameraActivity.CameraPrevie
|
|
|
355
396
|
bridge.releaseCall(pluginCall);
|
|
356
397
|
}
|
|
357
398
|
|
|
399
|
+
@Override
|
|
400
|
+
public void onZoomChanged(float zoom) {
|
|
401
|
+
JSObject result = new JSObject();
|
|
402
|
+
result.put("zoom", zoom);
|
|
403
|
+
notifyListeners("zoomChanged", result);
|
|
404
|
+
}
|
|
405
|
+
|
|
358
406
|
private boolean hasView(PluginCall call) {
|
|
359
407
|
if (fragment == null) {
|
|
360
408
|
return false;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PermissionState } from '@capacitor/core';
|
|
1
|
+
import type { PermissionState, PluginListenerHandle } from '@capacitor/core';
|
|
2
2
|
export type CameraPosition = 'rear' | 'front';
|
|
3
3
|
export interface CameraPreviewOptions {
|
|
4
4
|
/** Parent element to attach the video preview element to (applicable to the web platform only) */
|
|
@@ -54,6 +54,14 @@ export interface CameraOpacityOptions {
|
|
|
54
54
|
/** The percent opacity to set for camera view, default 1 */
|
|
55
55
|
opacity?: number;
|
|
56
56
|
}
|
|
57
|
+
export interface CameraZoomOptions {
|
|
58
|
+
/** The zoom level to set, where 1.0 is the default (no zoom) */
|
|
59
|
+
zoom: number;
|
|
60
|
+
}
|
|
61
|
+
export interface CameraZoomChangeEvent {
|
|
62
|
+
/** The new zoom level */
|
|
63
|
+
zoom: number;
|
|
64
|
+
}
|
|
57
65
|
export interface CameraPreviewPlugin {
|
|
58
66
|
/** Starts the camera preview instance */
|
|
59
67
|
start(options: CameraPreviewOptions): Promise<{}>;
|
|
@@ -79,8 +87,18 @@ export interface CameraPreviewPlugin {
|
|
|
79
87
|
flip(): Promise<void>;
|
|
80
88
|
/** Changes the opacity of the shown camera preview - Android / Web only */
|
|
81
89
|
setOpacity(options: CameraOpacityOptions): Promise<{}>;
|
|
90
|
+
/** Set the zoom level of the camera - Android / iOS only */
|
|
91
|
+
setZoom(options: CameraZoomOptions): Promise<void>;
|
|
92
|
+
/** Get the current zoom level of the camera - Android / iOS only */
|
|
93
|
+
getZoom(): Promise<{
|
|
94
|
+
zoom: number;
|
|
95
|
+
}>;
|
|
82
96
|
/** Check camera permission */
|
|
83
97
|
checkPermissions(): Promise<PermissionState>;
|
|
84
98
|
/** Request camera permission */
|
|
85
99
|
requestPermissions(): Promise<PermissionState>;
|
|
100
|
+
/** Listen for zoom changes - Android / iOS only */
|
|
101
|
+
addListener(eventName: 'zoomChanged', listenerFunc: (event: CameraZoomChangeEvent) => void): Promise<PluginListenerHandle>;
|
|
102
|
+
/** Remove all listeners for this plugin */
|
|
103
|
+
removeAllListeners(): Promise<void>;
|
|
86
104
|
}
|
package/dist/esm/web.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { WebPlugin } from '@capacitor/core';
|
|
2
|
-
import type {
|
|
2
|
+
import type { PluginListenerHandle } from '@capacitor/core';
|
|
3
|
+
import type { CameraPreviewOptions, CameraPreviewPictureOptions, CameraPreviewPlugin, CameraPreviewFlashMode, CameraSampleOptions, CameraOpacityOptions, CameraZoomOptions } from './definitions';
|
|
3
4
|
export declare class CameraPreviewWeb extends WebPlugin implements CameraPreviewPlugin {
|
|
4
5
|
/**
|
|
5
6
|
* track which camera is used based on start options
|
|
@@ -19,6 +20,10 @@ export declare class CameraPreviewWeb extends WebPlugin implements CameraPreview
|
|
|
19
20
|
}): Promise<void>;
|
|
20
21
|
flip(): Promise<void>;
|
|
21
22
|
setOpacity(_options: CameraOpacityOptions): Promise<any>;
|
|
23
|
+
setZoom(_options: CameraZoomOptions): Promise<any>;
|
|
24
|
+
getZoom(): Promise<any>;
|
|
22
25
|
checkPermissions(): Promise<PermissionState>;
|
|
23
26
|
requestPermissions(): Promise<PermissionState>;
|
|
27
|
+
addListener(_eventName: string, _listenerFunc: (info: any) => void): Promise<PluginListenerHandle>;
|
|
28
|
+
removeAllListeners(): Promise<void>;
|
|
24
29
|
}
|
package/dist/esm/web.js
CHANGED
|
@@ -110,11 +110,23 @@ export class CameraPreviewWeb extends WebPlugin {
|
|
|
110
110
|
video.style.setProperty('opacity', _options['opacity'].toString());
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
|
+
async setZoom(_options) {
|
|
114
|
+
throw new Error('setZoom not supported under the web platform');
|
|
115
|
+
}
|
|
116
|
+
async getZoom() {
|
|
117
|
+
throw new Error('getZoom not supported under the web platform');
|
|
118
|
+
}
|
|
113
119
|
async checkPermissions() {
|
|
114
120
|
throw new Error('checkPermissions not supported under the web platform');
|
|
115
121
|
}
|
|
116
122
|
async requestPermissions() {
|
|
117
123
|
throw new Error('requestPermissions not supported under the web platform');
|
|
118
124
|
}
|
|
125
|
+
async addListener(_eventName, _listenerFunc) {
|
|
126
|
+
throw new Error('addListener not supported under the web platform');
|
|
127
|
+
}
|
|
128
|
+
async removeAllListeners() {
|
|
129
|
+
throw new Error('removeAllListeners not supported under the web platform');
|
|
130
|
+
}
|
|
119
131
|
}
|
|
120
132
|
//# sourceMappingURL=web.js.map
|
package/dist/esm/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin.cjs.js
CHANGED
|
@@ -117,12 +117,24 @@ class CameraPreviewWeb extends core.WebPlugin {
|
|
|
117
117
|
video.style.setProperty('opacity', _options['opacity'].toString());
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
|
+
async setZoom(_options) {
|
|
121
|
+
throw new Error('setZoom not supported under the web platform');
|
|
122
|
+
}
|
|
123
|
+
async getZoom() {
|
|
124
|
+
throw new Error('getZoom not supported under the web platform');
|
|
125
|
+
}
|
|
120
126
|
async checkPermissions() {
|
|
121
127
|
throw new Error('checkPermissions not supported under the web platform');
|
|
122
128
|
}
|
|
123
129
|
async requestPermissions() {
|
|
124
130
|
throw new Error('requestPermissions not supported under the web platform');
|
|
125
131
|
}
|
|
132
|
+
async addListener(_eventName, _listenerFunc) {
|
|
133
|
+
throw new Error('addListener not supported under the web platform');
|
|
134
|
+
}
|
|
135
|
+
async removeAllListeners() {
|
|
136
|
+
throw new Error('removeAllListeners not supported under the web platform');
|
|
137
|
+
}
|
|
126
138
|
}
|
|
127
139
|
|
|
128
140
|
var web = /*#__PURE__*/Object.freeze({
|
package/dist/plugin.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst CameraPreview = registerPlugin('CameraPreview', {\n web: () => import('./web').then((m) => new m.CameraPreviewWeb()),\n});\nexport * from './definitions';\nexport { CameraPreview };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class CameraPreviewWeb extends WebPlugin {\n constructor() {\n super();\n }\n async start(options) {\n var _a;\n const stream = await navigator.mediaDevices.getUserMedia({ video: true });\n // Stop any existing stream so we can request media with different constraints based on user input\n stream.getTracks().forEach((track) => track.stop());\n const video = document.getElementById('video');\n const parent = document.getElementById(options.parent);\n if (video) {\n throw new Error('camera already started');\n }\n const videoElement = document.createElement('video');\n videoElement.id = 'video';\n videoElement.setAttribute('class', options.className || '');\n // Don't flip video feed if camera is rear facing\n if (options.position !== 'rear') {\n videoElement.setAttribute('style', '-webkit-transform: scaleX(-1); transform: scaleX(-1);');\n }\n const userAgent = navigator.userAgent.toLowerCase();\n const isSafari = userAgent.includes('safari') && !userAgent.includes('chrome');\n // Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful\n // Without these attributes videoElement.play() will throw a NotAllowedError\n // https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari\n if (isSafari) {\n videoElement.setAttribute('autoplay', 'true');\n videoElement.setAttribute('muted', 'true');\n videoElement.setAttribute('playsinline', 'true');\n }\n parent.appendChild(videoElement);\n if (!((_a = navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia)) {\n throw new Error('No media devices available');\n }\n const constraints = {\n video: {\n width: { ideal: options.width },\n height: { ideal: options.height },\n },\n };\n if (options.position === 'rear') {\n constraints.video.facingMode = 'environment';\n this.isBackCamera = true;\n }\n else {\n this.isBackCamera = false;\n }\n videoElement.srcObject = await navigator.mediaDevices.getUserMedia(constraints);\n videoElement.play();\n return {};\n }\n async stop() {\n const video = document.getElementById('video');\n if (video) {\n video.pause();\n const st = video.srcObject;\n const tracks = st.getTracks();\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n track.stop();\n }\n video.remove();\n }\n }\n async capture(options) {\n return new Promise((resolve, _) => {\n const video = document.getElementById('video');\n const canvas = document.createElement('canvas');\n // video.width = video.offsetWidth;\n const context = canvas.getContext('2d');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n // flip horizontally back camera isn't used\n if (!this.isBackCamera) {\n context.translate(video.videoWidth, 0);\n context.scale(-1, 1);\n }\n context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);\n let base64EncodedImage;\n if (options.quality != undefined) {\n base64EncodedImage = canvas\n .toDataURL('image/jpeg', options.quality / 100.0)\n .replace('data:image/jpeg;base64,', '');\n }\n else {\n base64EncodedImage = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');\n }\n resolve({\n value: base64EncodedImage,\n });\n });\n }\n async captureSample(_options) {\n return this.capture(_options);\n }\n async getSupportedFlashModes() {\n throw new Error('getSupportedFlashModes not supported under the web platform');\n }\n async setFlashMode(_options) {\n throw new Error('setFlashMode not supported under the web platform');\n }\n async flip() {\n throw new Error('flip not supported under the web platform');\n }\n async setOpacity(_options) {\n const video = document.getElementById('video');\n if (!!video && !!_options['opacity']) {\n video.style.setProperty('opacity', _options['opacity'].toString());\n }\n }\n async checkPermissions() {\n throw new Error('checkPermissions not supported under the web platform');\n }\n async requestPermissions() {\n throw new Error('requestPermissions not supported under the web platform');\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst CameraPreview = registerPlugin('CameraPreview', {\n web: () => import('./web').then((m) => new m.CameraPreviewWeb()),\n});\nexport * from './definitions';\nexport { CameraPreview };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class CameraPreviewWeb extends WebPlugin {\n constructor() {\n super();\n }\n async start(options) {\n var _a;\n const stream = await navigator.mediaDevices.getUserMedia({ video: true });\n // Stop any existing stream so we can request media with different constraints based on user input\n stream.getTracks().forEach((track) => track.stop());\n const video = document.getElementById('video');\n const parent = document.getElementById(options.parent);\n if (video) {\n throw new Error('camera already started');\n }\n const videoElement = document.createElement('video');\n videoElement.id = 'video';\n videoElement.setAttribute('class', options.className || '');\n // Don't flip video feed if camera is rear facing\n if (options.position !== 'rear') {\n videoElement.setAttribute('style', '-webkit-transform: scaleX(-1); transform: scaleX(-1);');\n }\n const userAgent = navigator.userAgent.toLowerCase();\n const isSafari = userAgent.includes('safari') && !userAgent.includes('chrome');\n // Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful\n // Without these attributes videoElement.play() will throw a NotAllowedError\n // https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari\n if (isSafari) {\n videoElement.setAttribute('autoplay', 'true');\n videoElement.setAttribute('muted', 'true');\n videoElement.setAttribute('playsinline', 'true');\n }\n parent.appendChild(videoElement);\n if (!((_a = navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia)) {\n throw new Error('No media devices available');\n }\n const constraints = {\n video: {\n width: { ideal: options.width },\n height: { ideal: options.height },\n },\n };\n if (options.position === 'rear') {\n constraints.video.facingMode = 'environment';\n this.isBackCamera = true;\n }\n else {\n this.isBackCamera = false;\n }\n videoElement.srcObject = await navigator.mediaDevices.getUserMedia(constraints);\n videoElement.play();\n return {};\n }\n async stop() {\n const video = document.getElementById('video');\n if (video) {\n video.pause();\n const st = video.srcObject;\n const tracks = st.getTracks();\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n track.stop();\n }\n video.remove();\n }\n }\n async capture(options) {\n return new Promise((resolve, _) => {\n const video = document.getElementById('video');\n const canvas = document.createElement('canvas');\n // video.width = video.offsetWidth;\n const context = canvas.getContext('2d');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n // flip horizontally back camera isn't used\n if (!this.isBackCamera) {\n context.translate(video.videoWidth, 0);\n context.scale(-1, 1);\n }\n context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);\n let base64EncodedImage;\n if (options.quality != undefined) {\n base64EncodedImage = canvas\n .toDataURL('image/jpeg', options.quality / 100.0)\n .replace('data:image/jpeg;base64,', '');\n }\n else {\n base64EncodedImage = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');\n }\n resolve({\n value: base64EncodedImage,\n });\n });\n }\n async captureSample(_options) {\n return this.capture(_options);\n }\n async getSupportedFlashModes() {\n throw new Error('getSupportedFlashModes not supported under the web platform');\n }\n async setFlashMode(_options) {\n throw new Error('setFlashMode not supported under the web platform');\n }\n async flip() {\n throw new Error('flip not supported under the web platform');\n }\n async setOpacity(_options) {\n const video = document.getElementById('video');\n if (!!video && !!_options['opacity']) {\n video.style.setProperty('opacity', _options['opacity'].toString());\n }\n }\n async setZoom(_options) {\n throw new Error('setZoom not supported under the web platform');\n }\n async getZoom() {\n throw new Error('getZoom not supported under the web platform');\n }\n async checkPermissions() {\n throw new Error('checkPermissions not supported under the web platform');\n }\n async requestPermissions() {\n throw new Error('requestPermissions not supported under the web platform');\n }\n async addListener(_eventName, _listenerFunc) {\n throw new Error('addListener not supported under the web platform');\n }\n async removeAllListeners() {\n throw new Error('removeAllListeners not supported under the web platform');\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|
package/dist/plugin.js
CHANGED
|
@@ -116,12 +116,24 @@ var capacitorSplashScreen = (function (exports, core) {
|
|
|
116
116
|
video.style.setProperty('opacity', _options['opacity'].toString());
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
|
+
async setZoom(_options) {
|
|
120
|
+
throw new Error('setZoom not supported under the web platform');
|
|
121
|
+
}
|
|
122
|
+
async getZoom() {
|
|
123
|
+
throw new Error('getZoom not supported under the web platform');
|
|
124
|
+
}
|
|
119
125
|
async checkPermissions() {
|
|
120
126
|
throw new Error('checkPermissions not supported under the web platform');
|
|
121
127
|
}
|
|
122
128
|
async requestPermissions() {
|
|
123
129
|
throw new Error('requestPermissions not supported under the web platform');
|
|
124
130
|
}
|
|
131
|
+
async addListener(_eventName, _listenerFunc) {
|
|
132
|
+
throw new Error('addListener not supported under the web platform');
|
|
133
|
+
}
|
|
134
|
+
async removeAllListeners() {
|
|
135
|
+
throw new Error('removeAllListeners not supported under the web platform');
|
|
136
|
+
}
|
|
125
137
|
}
|
|
126
138
|
|
|
127
139
|
var web = /*#__PURE__*/Object.freeze({
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst CameraPreview = registerPlugin('CameraPreview', {\n web: () => import('./web').then((m) => new m.CameraPreviewWeb()),\n});\nexport * from './definitions';\nexport { CameraPreview };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class CameraPreviewWeb extends WebPlugin {\n constructor() {\n super();\n }\n async start(options) {\n var _a;\n const stream = await navigator.mediaDevices.getUserMedia({ video: true });\n // Stop any existing stream so we can request media with different constraints based on user input\n stream.getTracks().forEach((track) => track.stop());\n const video = document.getElementById('video');\n const parent = document.getElementById(options.parent);\n if (video) {\n throw new Error('camera already started');\n }\n const videoElement = document.createElement('video');\n videoElement.id = 'video';\n videoElement.setAttribute('class', options.className || '');\n // Don't flip video feed if camera is rear facing\n if (options.position !== 'rear') {\n videoElement.setAttribute('style', '-webkit-transform: scaleX(-1); transform: scaleX(-1);');\n }\n const userAgent = navigator.userAgent.toLowerCase();\n const isSafari = userAgent.includes('safari') && !userAgent.includes('chrome');\n // Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful\n // Without these attributes videoElement.play() will throw a NotAllowedError\n // https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari\n if (isSafari) {\n videoElement.setAttribute('autoplay', 'true');\n videoElement.setAttribute('muted', 'true');\n videoElement.setAttribute('playsinline', 'true');\n }\n parent.appendChild(videoElement);\n if (!((_a = navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia)) {\n throw new Error('No media devices available');\n }\n const constraints = {\n video: {\n width: { ideal: options.width },\n height: { ideal: options.height },\n },\n };\n if (options.position === 'rear') {\n constraints.video.facingMode = 'environment';\n this.isBackCamera = true;\n }\n else {\n this.isBackCamera = false;\n }\n videoElement.srcObject = await navigator.mediaDevices.getUserMedia(constraints);\n videoElement.play();\n return {};\n }\n async stop() {\n const video = document.getElementById('video');\n if (video) {\n video.pause();\n const st = video.srcObject;\n const tracks = st.getTracks();\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n track.stop();\n }\n video.remove();\n }\n }\n async capture(options) {\n return new Promise((resolve, _) => {\n const video = document.getElementById('video');\n const canvas = document.createElement('canvas');\n // video.width = video.offsetWidth;\n const context = canvas.getContext('2d');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n // flip horizontally back camera isn't used\n if (!this.isBackCamera) {\n context.translate(video.videoWidth, 0);\n context.scale(-1, 1);\n }\n context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);\n let base64EncodedImage;\n if (options.quality != undefined) {\n base64EncodedImage = canvas\n .toDataURL('image/jpeg', options.quality / 100.0)\n .replace('data:image/jpeg;base64,', '');\n }\n else {\n base64EncodedImage = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');\n }\n resolve({\n value: base64EncodedImage,\n });\n });\n }\n async captureSample(_options) {\n return this.capture(_options);\n }\n async getSupportedFlashModes() {\n throw new Error('getSupportedFlashModes not supported under the web platform');\n }\n async setFlashMode(_options) {\n throw new Error('setFlashMode not supported under the web platform');\n }\n async flip() {\n throw new Error('flip not supported under the web platform');\n }\n async setOpacity(_options) {\n const video = document.getElementById('video');\n if (!!video && !!_options['opacity']) {\n video.style.setProperty('opacity', _options['opacity'].toString());\n }\n }\n async checkPermissions() {\n throw new Error('checkPermissions not supported under the web platform');\n }\n async requestPermissions() {\n throw new Error('requestPermissions not supported under the web platform');\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst CameraPreview = registerPlugin('CameraPreview', {\n web: () => import('./web').then((m) => new m.CameraPreviewWeb()),\n});\nexport * from './definitions';\nexport { CameraPreview };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class CameraPreviewWeb extends WebPlugin {\n constructor() {\n super();\n }\n async start(options) {\n var _a;\n const stream = await navigator.mediaDevices.getUserMedia({ video: true });\n // Stop any existing stream so we can request media with different constraints based on user input\n stream.getTracks().forEach((track) => track.stop());\n const video = document.getElementById('video');\n const parent = document.getElementById(options.parent);\n if (video) {\n throw new Error('camera already started');\n }\n const videoElement = document.createElement('video');\n videoElement.id = 'video';\n videoElement.setAttribute('class', options.className || '');\n // Don't flip video feed if camera is rear facing\n if (options.position !== 'rear') {\n videoElement.setAttribute('style', '-webkit-transform: scaleX(-1); transform: scaleX(-1);');\n }\n const userAgent = navigator.userAgent.toLowerCase();\n const isSafari = userAgent.includes('safari') && !userAgent.includes('chrome');\n // Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful\n // Without these attributes videoElement.play() will throw a NotAllowedError\n // https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari\n if (isSafari) {\n videoElement.setAttribute('autoplay', 'true');\n videoElement.setAttribute('muted', 'true');\n videoElement.setAttribute('playsinline', 'true');\n }\n parent.appendChild(videoElement);\n if (!((_a = navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia)) {\n throw new Error('No media devices available');\n }\n const constraints = {\n video: {\n width: { ideal: options.width },\n height: { ideal: options.height },\n },\n };\n if (options.position === 'rear') {\n constraints.video.facingMode = 'environment';\n this.isBackCamera = true;\n }\n else {\n this.isBackCamera = false;\n }\n videoElement.srcObject = await navigator.mediaDevices.getUserMedia(constraints);\n videoElement.play();\n return {};\n }\n async stop() {\n const video = document.getElementById('video');\n if (video) {\n video.pause();\n const st = video.srcObject;\n const tracks = st.getTracks();\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n track.stop();\n }\n video.remove();\n }\n }\n async capture(options) {\n return new Promise((resolve, _) => {\n const video = document.getElementById('video');\n const canvas = document.createElement('canvas');\n // video.width = video.offsetWidth;\n const context = canvas.getContext('2d');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n // flip horizontally back camera isn't used\n if (!this.isBackCamera) {\n context.translate(video.videoWidth, 0);\n context.scale(-1, 1);\n }\n context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);\n let base64EncodedImage;\n if (options.quality != undefined) {\n base64EncodedImage = canvas\n .toDataURL('image/jpeg', options.quality / 100.0)\n .replace('data:image/jpeg;base64,', '');\n }\n else {\n base64EncodedImage = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');\n }\n resolve({\n value: base64EncodedImage,\n });\n });\n }\n async captureSample(_options) {\n return this.capture(_options);\n }\n async getSupportedFlashModes() {\n throw new Error('getSupportedFlashModes not supported under the web platform');\n }\n async setFlashMode(_options) {\n throw new Error('setFlashMode not supported under the web platform');\n }\n async flip() {\n throw new Error('flip not supported under the web platform');\n }\n async setOpacity(_options) {\n const video = document.getElementById('video');\n if (!!video && !!_options['opacity']) {\n video.style.setProperty('opacity', _options['opacity'].toString());\n }\n }\n async setZoom(_options) {\n throw new Error('setZoom not supported under the web platform');\n }\n async getZoom() {\n throw new Error('getZoom not supported under the web platform');\n }\n async checkPermissions() {\n throw new Error('checkPermissions not supported under the web platform');\n }\n async requestPermissions() {\n throw new Error('requestPermissions not supported under the web platform');\n }\n async addListener(_eventName, _listenerFunc) {\n throw new Error('addListener not supported under the web platform');\n }\n async removeAllListeners() {\n throw new Error('removeAllListeners not supported under the web platform');\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|
|
@@ -15,6 +15,9 @@ public enum CameraPosition {
|
|
|
15
15
|
case rear
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
+
protocol CameraControllerDelegate: AnyObject {
|
|
19
|
+
func cameraController(_ controller: CameraController, didChangeZoomTo zoomLevel: CGFloat)
|
|
20
|
+
}
|
|
18
21
|
|
|
19
22
|
extension CameraControllerError: LocalizedError {
|
|
20
23
|
public var errorDescription: String? {
|
|
@@ -54,6 +57,9 @@ class CameraController: NSObject {
|
|
|
54
57
|
|
|
55
58
|
/** Video zoom factor that is used for manually zooming in and out via pinch gesture */
|
|
56
59
|
var videoZoomFactor: CGFloat = 1
|
|
60
|
+
|
|
61
|
+
/** Delegate for camera events */
|
|
62
|
+
weak var delegate: CameraControllerDelegate?
|
|
57
63
|
|
|
58
64
|
public func prepare(cameraPosition: CameraPosition?, enableHighResolution isHighResolutionPhotoEnabled: Bool, completionHandler: @escaping (Error?) -> Void) {
|
|
59
65
|
// Set up capture session
|
|
@@ -388,6 +394,54 @@ class CameraController: NSObject {
|
|
|
388
394
|
target.addGestureRecognizer(pinchGesture)
|
|
389
395
|
}
|
|
390
396
|
|
|
397
|
+
/**
|
|
398
|
+
Set the zoom level of the camera
|
|
399
|
+
|
|
400
|
+
- Parameters:
|
|
401
|
+
- zoomLevel: The zoom level to set (1.0 = no zoom, higher values = more zoom)
|
|
402
|
+
- Throws: `CameraControllerError.noCamerasAvailable` if camera is not available
|
|
403
|
+
*/
|
|
404
|
+
public func setZoom(zoomLevel: CGFloat) throws {
|
|
405
|
+
guard let device = self.currentCamera else {
|
|
406
|
+
throw CameraControllerError.noCamerasAvailable
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
func minMaxZoom(_ factor: CGFloat) -> CGFloat {
|
|
410
|
+
return max(1.0, min(factor, device.activeFormat.videoMaxZoomFactor))
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
let constrainedZoomFactor = minMaxZoom(zoomLevel)
|
|
414
|
+
|
|
415
|
+
do {
|
|
416
|
+
try device.lockForConfiguration()
|
|
417
|
+
defer { device.unlockForConfiguration() }
|
|
418
|
+
|
|
419
|
+
device.videoZoomFactor = constrainedZoomFactor
|
|
420
|
+
|
|
421
|
+
// Update our stored zoom factor
|
|
422
|
+
videoZoomFactor = constrainedZoomFactor
|
|
423
|
+
|
|
424
|
+
// Notify delegate of zoom change
|
|
425
|
+
delegate?.cameraController(self, didChangeZoomTo: constrainedZoomFactor)
|
|
426
|
+
} catch {
|
|
427
|
+
throw CameraControllerError.invalidOperation
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
Get the current zoom level of the camera
|
|
433
|
+
|
|
434
|
+
- Returns: The current zoom level (1.0 = no zoom, higher values = more zoom)
|
|
435
|
+
- Throws: `CameraControllerError.noCamerasAvailable` if camera is not available
|
|
436
|
+
*/
|
|
437
|
+
public func getZoom() throws -> CGFloat {
|
|
438
|
+
guard let device = self.currentCamera else {
|
|
439
|
+
throw CameraControllerError.noCamerasAvailable
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
return device.videoZoomFactor
|
|
443
|
+
}
|
|
444
|
+
|
|
391
445
|
}
|
|
392
446
|
|
|
393
447
|
extension UIImage {
|
|
@@ -507,17 +561,24 @@ extension CameraController: UIGestureRecognizerDelegate {
|
|
|
507
561
|
defer { device.unlockForConfiguration() }
|
|
508
562
|
|
|
509
563
|
device.videoZoomFactor = factor
|
|
564
|
+
|
|
565
|
+
// Notify delegate of zoom change during pinch
|
|
566
|
+
delegate?.cameraController(self, didChangeZoomTo: factor)
|
|
510
567
|
} catch {
|
|
511
568
|
debugPrint(error)
|
|
512
569
|
}
|
|
513
570
|
}
|
|
514
571
|
|
|
515
572
|
switch pinch.state {
|
|
516
|
-
case .began:
|
|
573
|
+
case .began:
|
|
574
|
+
// Store the current zoom factor when pinch begins
|
|
575
|
+
videoZoomFactor = device.videoZoomFactor
|
|
517
576
|
case .changed:
|
|
518
|
-
|
|
577
|
+
// Calculate new zoom factor based on current zoom and pinch scale
|
|
578
|
+
let newScaleFactor = minMaxZoom(videoZoomFactor * pinch.scale)
|
|
519
579
|
update(scale: newScaleFactor)
|
|
520
580
|
case .ended:
|
|
581
|
+
// Update stored zoom factor to the final zoom level
|
|
521
582
|
videoZoomFactor = device.videoZoomFactor
|
|
522
583
|
default: break
|
|
523
584
|
}
|
package/ios/Plugin/Plugin.m
CHANGED
|
@@ -11,6 +11,8 @@ CAP_PLUGIN(CameraPreview, "CameraPreview",
|
|
|
11
11
|
CAP_PLUGIN_METHOD(flip, CAPPluginReturnPromise);
|
|
12
12
|
CAP_PLUGIN_METHOD(getSupportedFlashModes, CAPPluginReturnPromise);
|
|
13
13
|
CAP_PLUGIN_METHOD(setFlashMode, CAPPluginReturnPromise);
|
|
14
|
+
CAP_PLUGIN_METHOD(setZoom, CAPPluginReturnPromise);
|
|
15
|
+
CAP_PLUGIN_METHOD(getZoom, CAPPluginReturnPromise);
|
|
14
16
|
CAP_PLUGIN_METHOD(checkPermissions, CAPPluginReturnPromise);
|
|
15
17
|
CAP_PLUGIN_METHOD(requestPermissions, CAPPluginReturnPromise);
|
|
16
18
|
)
|
package/ios/Plugin/Plugin.swift
CHANGED
|
@@ -6,7 +6,7 @@ import AVFoundation
|
|
|
6
6
|
* here: https://capacitor.ionicframework.com/docs/plugins/ios
|
|
7
7
|
*/
|
|
8
8
|
@objc(CameraPreview)
|
|
9
|
-
public class CameraPreview: CAPPlugin {
|
|
9
|
+
public class CameraPreview: CAPPlugin, CameraControllerDelegate {
|
|
10
10
|
let cameraController = CameraController()
|
|
11
11
|
var cameraPosition: CameraPosition = .rear
|
|
12
12
|
var x: CGFloat = 0.0
|
|
@@ -20,6 +20,13 @@ public class CameraPreview: CAPPlugin {
|
|
|
20
20
|
var storeToFile = false
|
|
21
21
|
var enableZoom = false
|
|
22
22
|
var enableHighResolution = false
|
|
23
|
+
|
|
24
|
+
// MARK: - CameraControllerDelegate
|
|
25
|
+
|
|
26
|
+
func cameraController(_ controller: CameraController, didChangeZoomTo zoomLevel: CGFloat) {
|
|
27
|
+
// Emit zoom change event to JavaScript
|
|
28
|
+
notifyListeners("zoomChanged", data: ["zoom": zoomLevel])
|
|
29
|
+
}
|
|
23
30
|
|
|
24
31
|
/**
|
|
25
32
|
Start the camera preview in a new UIView
|
|
@@ -39,6 +46,9 @@ public class CameraPreview: CAPPlugin {
|
|
|
39
46
|
return
|
|
40
47
|
}
|
|
41
48
|
|
|
49
|
+
// Set up delegate for zoom change events
|
|
50
|
+
self?.cameraController.delegate = self
|
|
51
|
+
|
|
42
52
|
self?.cameraController.prepare(cameraPosition: self?.cameraPosition, enableHighResolution: self?.enableHighResolution ?? false) { error in
|
|
43
53
|
if let error = error {
|
|
44
54
|
call.reject(error.localizedDescription)
|
|
@@ -202,6 +212,50 @@ public class CameraPreview: CAPPlugin {
|
|
|
202
212
|
}
|
|
203
213
|
}
|
|
204
214
|
|
|
215
|
+
/**
|
|
216
|
+
Set the zoom level of the camera
|
|
217
|
+
*/
|
|
218
|
+
@objc func setZoom(_ call: CAPPluginCall) {
|
|
219
|
+
guard let captureSession = self.cameraController.captureSession, captureSession.isRunning else {
|
|
220
|
+
call.reject("camera is not running")
|
|
221
|
+
return
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
guard let zoomLevel = call.getDouble("zoom") else {
|
|
225
|
+
call.reject("zoom parameter is missing")
|
|
226
|
+
return
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if zoomLevel < 1.0 {
|
|
230
|
+
call.reject("zoom level must be >= 1.0")
|
|
231
|
+
return
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
do {
|
|
235
|
+
try self.cameraController.setZoom(zoomLevel: CGFloat(zoomLevel))
|
|
236
|
+
call.resolve()
|
|
237
|
+
} catch {
|
|
238
|
+
call.reject("failed to set zoom level: \(error.localizedDescription)")
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
Get the current zoom level of the camera
|
|
244
|
+
*/
|
|
245
|
+
@objc func getZoom(_ call: CAPPluginCall) {
|
|
246
|
+
guard let captureSession = self.cameraController.captureSession, captureSession.isRunning else {
|
|
247
|
+
call.reject("camera is not running")
|
|
248
|
+
return
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
do {
|
|
252
|
+
let currentZoom = try self.cameraController.getZoom()
|
|
253
|
+
call.resolve(["zoom": currentZoom])
|
|
254
|
+
} catch {
|
|
255
|
+
call.reject("failed to get zoom level: \(error.localizedDescription)")
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
205
259
|
/**
|
|
206
260
|
Helper method for initializing the plugin settings based on the Capacitor call
|
|
207
261
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@carviz/capacitor-camera-preview",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.1.1",
|
|
4
4
|
"description": "Fork of the capacitor-community/camera-preview plugin focusing on high resolution photos without bloating up the code.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/plugin.cjs.js",
|
|
@@ -82,4 +82,4 @@
|
|
|
82
82
|
"bugs": {
|
|
83
83
|
"url": "https://github.com/GetCarviz/capacitor-camera-preview/issues"
|
|
84
84
|
}
|
|
85
|
-
}
|
|
85
|
+
}
|