@capgo/camera-preview 3.2.8 → 3.4.4
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/CapgoCameraPreview.podspec +1 -1
- package/README.md +263 -46
- package/android/.gradle/7.4.2/checksums/checksums.lock +0 -0
- package/android/.gradle/7.4.2/checksums/md5-checksums.bin +0 -0
- package/android/.gradle/7.4.2/checksums/sha1-checksums.bin +0 -0
- package/android/.gradle/7.4.2/dependencies-accessors/dependencies-accessors.lock +0 -0
- package/android/.gradle/7.4.2/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/7.4.2/executionHistory/executionHistory.lock +0 -0
- package/android/.gradle/7.4.2/fileChanges/last-build.bin +0 -0
- package/android/.gradle/7.4.2/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/7.4.2/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/build.gradle +8 -8
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +2 -3
- package/android/gradlew +182 -108
- package/android/src/main/java/com/ahm/capacitor/camera/preview/CameraActivity.java +5 -7
- package/android/src/main/java/com/ahm/capacitor/camera/preview/CameraPreview.java +17 -9
- package/dist/docs.json +407 -0
- package/dist/esm/definitions.d.ts +12 -6
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/web.d.ts +6 -4
- package/dist/esm/web.js +98 -82
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +165 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.js +168 -0
- package/dist/plugin.js.map +1 -0
- package/ios/Plugin/CameraController.swift +19 -1
- package/ios/Plugin/Plugin.m +1 -0
- package/ios/Plugin/Plugin.swift +42 -7
- package/ios/Plugin.xcodeproj/project.pbxproj +10 -4
- package/ios/Podfile +1 -1
- package/ios/Podfile.lock +4 -4
- package/package.json +40 -35
package/dist/esm/web.js
CHANGED
|
@@ -7,102 +7,119 @@ export class CameraPreviewWeb extends WebPlugin {
|
|
|
7
7
|
});
|
|
8
8
|
}
|
|
9
9
|
async start(options) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
10
|
+
var _a;
|
|
11
|
+
await navigator.mediaDevices
|
|
12
|
+
.getUserMedia({
|
|
13
|
+
audio: !options.disableAudio,
|
|
14
|
+
video: true,
|
|
15
|
+
})
|
|
16
|
+
.then((stream) => {
|
|
17
|
+
// Stop any existing stream so we can request media with different constraints based on user input
|
|
18
|
+
stream.getTracks().forEach((track) => track.stop());
|
|
19
|
+
})
|
|
20
|
+
.catch((error) => {
|
|
21
|
+
Promise.reject(error);
|
|
22
|
+
});
|
|
23
|
+
const video = document.getElementById('video');
|
|
24
|
+
const parent = document.getElementById(options.parent);
|
|
25
|
+
if (!video) {
|
|
26
|
+
const videoElement = document.createElement('video');
|
|
27
|
+
videoElement.id = 'video';
|
|
28
|
+
videoElement.setAttribute('class', options.className || '');
|
|
29
|
+
// Don't flip video feed if camera is rear facing
|
|
30
|
+
if (options.position !== 'rear') {
|
|
31
|
+
videoElement.setAttribute('style', '-webkit-transform: scaleX(-1); transform: scaleX(-1);');
|
|
32
|
+
}
|
|
33
|
+
const userAgent = navigator.userAgent.toLowerCase();
|
|
34
|
+
const isSafari = userAgent.includes('safari') && !userAgent.includes('chrome');
|
|
35
|
+
// Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful
|
|
36
|
+
// Without these attributes videoElement.play() will throw a NotAllowedError
|
|
37
|
+
// https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari
|
|
38
|
+
if (isSafari) {
|
|
39
|
+
videoElement.setAttribute('autoplay', 'true');
|
|
40
|
+
videoElement.setAttribute('muted', 'true');
|
|
41
|
+
videoElement.setAttribute('playsinline', 'true');
|
|
42
|
+
}
|
|
43
|
+
parent.appendChild(videoElement);
|
|
44
|
+
if ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) {
|
|
45
|
+
const constraints = {
|
|
46
|
+
video: {
|
|
47
|
+
width: { ideal: options.width },
|
|
48
|
+
height: { ideal: options.height },
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
if (options.position === 'rear') {
|
|
52
|
+
constraints.video.facingMode = 'environment';
|
|
53
|
+
this.isBackCamera = true;
|
|
32
54
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
// Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful
|
|
36
|
-
// Without these attributes videoElement.play() will throw a NotAllowedError
|
|
37
|
-
// https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari
|
|
38
|
-
if (isSafari) {
|
|
39
|
-
videoElement.setAttribute('autoplay', 'true');
|
|
40
|
-
videoElement.setAttribute('muted', 'true');
|
|
41
|
-
videoElement.setAttribute('playsinline', 'true');
|
|
55
|
+
else {
|
|
56
|
+
this.isBackCamera = false;
|
|
42
57
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
video: {
|
|
47
|
-
width: { ideal: options.width },
|
|
48
|
-
height: { ideal: options.height }
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
if (options.position === 'rear') {
|
|
52
|
-
constraints.video.facingMode = 'environment';
|
|
53
|
-
this.isBackCamera = true;
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
this.isBackCamera = false;
|
|
57
|
-
}
|
|
58
|
-
navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
|
|
58
|
+
const self = this;
|
|
59
|
+
await navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
|
|
60
|
+
if (document.getElementById('video')) {
|
|
59
61
|
//video.src = window.URL.createObjectURL(stream);
|
|
60
62
|
videoElement.srcObject = stream;
|
|
61
63
|
videoElement.play();
|
|
62
|
-
resolve({});
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
Promise.resolve({});
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
self.stopStream(stream);
|
|
68
|
+
Promise.reject({ message: 'camera already stopped' });
|
|
69
|
+
}
|
|
70
|
+
}, (err) => {
|
|
71
|
+
Promise.reject(err);
|
|
72
|
+
});
|
|
67
73
|
}
|
|
68
|
-
|
|
69
|
-
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
Promise.reject({ message: 'camera already started' });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
stopStream(stream) {
|
|
80
|
+
if (stream) {
|
|
81
|
+
const tracks = stream.getTracks();
|
|
82
|
+
for (const track of tracks) {
|
|
83
|
+
track.stop();
|
|
70
84
|
}
|
|
71
|
-
}
|
|
85
|
+
}
|
|
72
86
|
}
|
|
73
87
|
async stop() {
|
|
74
88
|
const video = document.getElementById('video');
|
|
75
89
|
if (video) {
|
|
76
90
|
video.pause();
|
|
77
|
-
|
|
78
|
-
const tracks = st.getTracks();
|
|
79
|
-
for (var i = 0; i < tracks.length; i++) {
|
|
80
|
-
var track = tracks[i];
|
|
81
|
-
track.stop();
|
|
82
|
-
}
|
|
91
|
+
this.stopStream(video.srcObject);
|
|
83
92
|
video.remove();
|
|
84
93
|
}
|
|
85
94
|
}
|
|
86
95
|
async capture(options) {
|
|
87
|
-
return new Promise((resolve,
|
|
96
|
+
return new Promise((resolve, reject) => {
|
|
88
97
|
const video = document.getElementById('video');
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
canvas.width = video.videoWidth;
|
|
93
|
-
canvas.height = video.videoHeight;
|
|
94
|
-
// flip horizontally back camera isn't used
|
|
95
|
-
if (!this.isBackCamera) {
|
|
96
|
-
context.translate(video.videoWidth, 0);
|
|
97
|
-
context.scale(-1, 1);
|
|
98
|
+
if (!video || !video.srcObject) {
|
|
99
|
+
reject({ message: 'camera is not running' });
|
|
100
|
+
return;
|
|
98
101
|
}
|
|
99
|
-
|
|
102
|
+
// video.width = video.offsetWidth;
|
|
100
103
|
let base64EncodedImage;
|
|
101
|
-
if (
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
if (video && video.videoWidth > 0 && video.videoHeight > 0) {
|
|
105
|
+
const canvas = document.createElement('canvas');
|
|
106
|
+
const context = canvas.getContext('2d');
|
|
107
|
+
canvas.width = video.videoWidth;
|
|
108
|
+
canvas.height = video.videoHeight;
|
|
109
|
+
// flip horizontally back camera isn't used
|
|
110
|
+
if (!this.isBackCamera) {
|
|
111
|
+
context.translate(video.videoWidth, 0);
|
|
112
|
+
context.scale(-1, 1);
|
|
113
|
+
}
|
|
114
|
+
context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
|
|
115
|
+
if ((options.format || 'jpeg') === 'jpeg') {
|
|
116
|
+
base64EncodedImage = canvas
|
|
117
|
+
.toDataURL('image/jpeg', (options.quality || 85) / 100.0)
|
|
118
|
+
.replace('data:image/jpeg;base64,', '');
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
base64EncodedImage = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');
|
|
122
|
+
}
|
|
106
123
|
}
|
|
107
124
|
resolve({
|
|
108
125
|
value: base64EncodedImage,
|
|
@@ -115,8 +132,11 @@ export class CameraPreviewWeb extends WebPlugin {
|
|
|
115
132
|
async getSupportedFlashModes() {
|
|
116
133
|
throw new Error('getSupportedFlashModes not supported under the web platform');
|
|
117
134
|
}
|
|
135
|
+
async getHorizontalFov() {
|
|
136
|
+
throw new Error('getHorizontalFov not supported under the web platform');
|
|
137
|
+
}
|
|
118
138
|
async setFlashMode(_options) {
|
|
119
|
-
throw new Error('setFlashMode not supported under the web platform');
|
|
139
|
+
throw new Error('setFlashMode not supported under the web platform' + _options);
|
|
120
140
|
}
|
|
121
141
|
async flip() {
|
|
122
142
|
throw new Error('flip not supported under the web platform');
|
|
@@ -128,8 +148,4 @@ export class CameraPreviewWeb extends WebPlugin {
|
|
|
128
148
|
}
|
|
129
149
|
}
|
|
130
150
|
}
|
|
131
|
-
const CameraPreview = new CameraPreviewWeb();
|
|
132
|
-
export { CameraPreview };
|
|
133
|
-
import { registerWebPlugin } from '@capacitor/core';
|
|
134
|
-
registerWebPlugin(CameraPreview);
|
|
135
151
|
//# 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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"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@capacitor/core');
|
|
4
|
+
|
|
5
|
+
const CameraPreview = core.registerPlugin('CameraPreview', {
|
|
6
|
+
web: () => Promise.resolve().then(function () { return web; }).then((m) => new m.CameraPreviewWeb()),
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
class CameraPreviewWeb extends core.WebPlugin {
|
|
10
|
+
constructor() {
|
|
11
|
+
super({
|
|
12
|
+
name: 'CameraPreview',
|
|
13
|
+
platforms: ['web'],
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
async start(options) {
|
|
17
|
+
var _a;
|
|
18
|
+
await navigator.mediaDevices
|
|
19
|
+
.getUserMedia({
|
|
20
|
+
audio: !options.disableAudio,
|
|
21
|
+
video: true,
|
|
22
|
+
})
|
|
23
|
+
.then((stream) => {
|
|
24
|
+
// Stop any existing stream so we can request media with different constraints based on user input
|
|
25
|
+
stream.getTracks().forEach((track) => track.stop());
|
|
26
|
+
})
|
|
27
|
+
.catch((error) => {
|
|
28
|
+
Promise.reject(error);
|
|
29
|
+
});
|
|
30
|
+
const video = document.getElementById('video');
|
|
31
|
+
const parent = document.getElementById(options.parent);
|
|
32
|
+
if (!video) {
|
|
33
|
+
const videoElement = document.createElement('video');
|
|
34
|
+
videoElement.id = 'video';
|
|
35
|
+
videoElement.setAttribute('class', options.className || '');
|
|
36
|
+
// Don't flip video feed if camera is rear facing
|
|
37
|
+
if (options.position !== 'rear') {
|
|
38
|
+
videoElement.setAttribute('style', '-webkit-transform: scaleX(-1); transform: scaleX(-1);');
|
|
39
|
+
}
|
|
40
|
+
const userAgent = navigator.userAgent.toLowerCase();
|
|
41
|
+
const isSafari = userAgent.includes('safari') && !userAgent.includes('chrome');
|
|
42
|
+
// Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful
|
|
43
|
+
// Without these attributes videoElement.play() will throw a NotAllowedError
|
|
44
|
+
// https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari
|
|
45
|
+
if (isSafari) {
|
|
46
|
+
videoElement.setAttribute('autoplay', 'true');
|
|
47
|
+
videoElement.setAttribute('muted', 'true');
|
|
48
|
+
videoElement.setAttribute('playsinline', 'true');
|
|
49
|
+
}
|
|
50
|
+
parent.appendChild(videoElement);
|
|
51
|
+
if ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) {
|
|
52
|
+
const constraints = {
|
|
53
|
+
video: {
|
|
54
|
+
width: { ideal: options.width },
|
|
55
|
+
height: { ideal: options.height },
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
if (options.position === 'rear') {
|
|
59
|
+
constraints.video.facingMode = 'environment';
|
|
60
|
+
this.isBackCamera = true;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
this.isBackCamera = false;
|
|
64
|
+
}
|
|
65
|
+
const self = this;
|
|
66
|
+
await navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
|
|
67
|
+
if (document.getElementById('video')) {
|
|
68
|
+
//video.src = window.URL.createObjectURL(stream);
|
|
69
|
+
videoElement.srcObject = stream;
|
|
70
|
+
videoElement.play();
|
|
71
|
+
Promise.resolve({});
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
self.stopStream(stream);
|
|
75
|
+
Promise.reject({ message: 'camera already stopped' });
|
|
76
|
+
}
|
|
77
|
+
}, (err) => {
|
|
78
|
+
Promise.reject(err);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
Promise.reject({ message: 'camera already started' });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
stopStream(stream) {
|
|
87
|
+
if (stream) {
|
|
88
|
+
const tracks = stream.getTracks();
|
|
89
|
+
for (const track of tracks) {
|
|
90
|
+
track.stop();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async stop() {
|
|
95
|
+
const video = document.getElementById('video');
|
|
96
|
+
if (video) {
|
|
97
|
+
video.pause();
|
|
98
|
+
this.stopStream(video.srcObject);
|
|
99
|
+
video.remove();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async capture(options) {
|
|
103
|
+
return new Promise((resolve, reject) => {
|
|
104
|
+
const video = document.getElementById('video');
|
|
105
|
+
if (!video || !video.srcObject) {
|
|
106
|
+
reject({ message: 'camera is not running' });
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// video.width = video.offsetWidth;
|
|
110
|
+
let base64EncodedImage;
|
|
111
|
+
if (video && video.videoWidth > 0 && video.videoHeight > 0) {
|
|
112
|
+
const canvas = document.createElement('canvas');
|
|
113
|
+
const context = canvas.getContext('2d');
|
|
114
|
+
canvas.width = video.videoWidth;
|
|
115
|
+
canvas.height = video.videoHeight;
|
|
116
|
+
// flip horizontally back camera isn't used
|
|
117
|
+
if (!this.isBackCamera) {
|
|
118
|
+
context.translate(video.videoWidth, 0);
|
|
119
|
+
context.scale(-1, 1);
|
|
120
|
+
}
|
|
121
|
+
context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
|
|
122
|
+
if ((options.format || 'jpeg') === 'jpeg') {
|
|
123
|
+
base64EncodedImage = canvas
|
|
124
|
+
.toDataURL('image/jpeg', (options.quality || 85) / 100.0)
|
|
125
|
+
.replace('data:image/jpeg;base64,', '');
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
base64EncodedImage = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
resolve({
|
|
132
|
+
value: base64EncodedImage,
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
async captureSample(_options) {
|
|
137
|
+
return this.capture(_options);
|
|
138
|
+
}
|
|
139
|
+
async getSupportedFlashModes() {
|
|
140
|
+
throw new Error('getSupportedFlashModes not supported under the web platform');
|
|
141
|
+
}
|
|
142
|
+
async getHorizontalFov() {
|
|
143
|
+
throw new Error('getHorizontalFov not supported under the web platform');
|
|
144
|
+
}
|
|
145
|
+
async setFlashMode(_options) {
|
|
146
|
+
throw new Error('setFlashMode not supported under the web platform' + _options);
|
|
147
|
+
}
|
|
148
|
+
async flip() {
|
|
149
|
+
throw new Error('flip not supported under the web platform');
|
|
150
|
+
}
|
|
151
|
+
async setOpacity(_options) {
|
|
152
|
+
const video = document.getElementById('video');
|
|
153
|
+
if (!!video && !!_options['opacity']) {
|
|
154
|
+
video.style.setProperty('opacity', _options['opacity'].toString());
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
var web = /*#__PURE__*/Object.freeze({
|
|
160
|
+
__proto__: null,
|
|
161
|
+
CameraPreviewWeb: CameraPreviewWeb
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
exports.CameraPreview = CameraPreview;
|
|
165
|
+
//# sourceMappingURL=plugin.cjs.js.map
|
|
@@ -0,0 +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 name: 'CameraPreview',\n platforms: ['web'],\n });\n }\n async start(options) {\n var _a;\n await navigator.mediaDevices\n .getUserMedia({\n audio: !options.disableAudio,\n video: true,\n })\n .then((stream) => {\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 })\n .catch((error) => {\n Promise.reject(error);\n });\n const video = document.getElementById('video');\n const parent = document.getElementById(options.parent);\n if (!video) {\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 === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) {\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 const self = this;\n await navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {\n if (document.getElementById('video')) {\n //video.src = window.URL.createObjectURL(stream);\n videoElement.srcObject = stream;\n videoElement.play();\n Promise.resolve({});\n }\n else {\n self.stopStream(stream);\n Promise.reject({ message: 'camera already stopped' });\n }\n }, (err) => {\n Promise.reject(err);\n });\n }\n }\n else {\n Promise.reject({ message: 'camera already started' });\n }\n }\n stopStream(stream) {\n if (stream) {\n const tracks = stream.getTracks();\n for (const track of tracks) {\n track.stop();\n }\n }\n }\n async stop() {\n const video = document.getElementById('video');\n if (video) {\n video.pause();\n this.stopStream(video.srcObject);\n video.remove();\n }\n }\n async capture(options) {\n return new Promise((resolve, reject) => {\n const video = document.getElementById('video');\n if (!video || !video.srcObject) {\n reject({ message: 'camera is not running' });\n return;\n }\n // video.width = video.offsetWidth;\n let base64EncodedImage;\n if (video && video.videoWidth > 0 && video.videoHeight > 0) {\n const canvas = document.createElement('canvas');\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 if ((options.format || 'jpeg') === 'jpeg') {\n base64EncodedImage = canvas\n .toDataURL('image/jpeg', (options.quality || 85) / 100.0)\n .replace('data:image/jpeg;base64,', '');\n }\n else {\n base64EncodedImage = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');\n }\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 getHorizontalFov() {\n throw new Error('getHorizontalFov not supported under the web platform');\n }\n async setFlashMode(_options) {\n throw new Error('setFlashMode not supported under the web platform' + _options);\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}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
var capacitorApp = (function (exports, core) {
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const CameraPreview = core.registerPlugin('CameraPreview', {
|
|
5
|
+
web: () => Promise.resolve().then(function () { return web; }).then((m) => new m.CameraPreviewWeb()),
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
class CameraPreviewWeb extends core.WebPlugin {
|
|
9
|
+
constructor() {
|
|
10
|
+
super({
|
|
11
|
+
name: 'CameraPreview',
|
|
12
|
+
platforms: ['web'],
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
async start(options) {
|
|
16
|
+
var _a;
|
|
17
|
+
await navigator.mediaDevices
|
|
18
|
+
.getUserMedia({
|
|
19
|
+
audio: !options.disableAudio,
|
|
20
|
+
video: true,
|
|
21
|
+
})
|
|
22
|
+
.then((stream) => {
|
|
23
|
+
// Stop any existing stream so we can request media with different constraints based on user input
|
|
24
|
+
stream.getTracks().forEach((track) => track.stop());
|
|
25
|
+
})
|
|
26
|
+
.catch((error) => {
|
|
27
|
+
Promise.reject(error);
|
|
28
|
+
});
|
|
29
|
+
const video = document.getElementById('video');
|
|
30
|
+
const parent = document.getElementById(options.parent);
|
|
31
|
+
if (!video) {
|
|
32
|
+
const videoElement = document.createElement('video');
|
|
33
|
+
videoElement.id = 'video';
|
|
34
|
+
videoElement.setAttribute('class', options.className || '');
|
|
35
|
+
// Don't flip video feed if camera is rear facing
|
|
36
|
+
if (options.position !== 'rear') {
|
|
37
|
+
videoElement.setAttribute('style', '-webkit-transform: scaleX(-1); transform: scaleX(-1);');
|
|
38
|
+
}
|
|
39
|
+
const userAgent = navigator.userAgent.toLowerCase();
|
|
40
|
+
const isSafari = userAgent.includes('safari') && !userAgent.includes('chrome');
|
|
41
|
+
// Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful
|
|
42
|
+
// Without these attributes videoElement.play() will throw a NotAllowedError
|
|
43
|
+
// https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari
|
|
44
|
+
if (isSafari) {
|
|
45
|
+
videoElement.setAttribute('autoplay', 'true');
|
|
46
|
+
videoElement.setAttribute('muted', 'true');
|
|
47
|
+
videoElement.setAttribute('playsinline', 'true');
|
|
48
|
+
}
|
|
49
|
+
parent.appendChild(videoElement);
|
|
50
|
+
if ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) {
|
|
51
|
+
const constraints = {
|
|
52
|
+
video: {
|
|
53
|
+
width: { ideal: options.width },
|
|
54
|
+
height: { ideal: options.height },
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
if (options.position === 'rear') {
|
|
58
|
+
constraints.video.facingMode = 'environment';
|
|
59
|
+
this.isBackCamera = true;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
this.isBackCamera = false;
|
|
63
|
+
}
|
|
64
|
+
const self = this;
|
|
65
|
+
await navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
|
|
66
|
+
if (document.getElementById('video')) {
|
|
67
|
+
//video.src = window.URL.createObjectURL(stream);
|
|
68
|
+
videoElement.srcObject = stream;
|
|
69
|
+
videoElement.play();
|
|
70
|
+
Promise.resolve({});
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
self.stopStream(stream);
|
|
74
|
+
Promise.reject({ message: 'camera already stopped' });
|
|
75
|
+
}
|
|
76
|
+
}, (err) => {
|
|
77
|
+
Promise.reject(err);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
Promise.reject({ message: 'camera already started' });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
stopStream(stream) {
|
|
86
|
+
if (stream) {
|
|
87
|
+
const tracks = stream.getTracks();
|
|
88
|
+
for (const track of tracks) {
|
|
89
|
+
track.stop();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async stop() {
|
|
94
|
+
const video = document.getElementById('video');
|
|
95
|
+
if (video) {
|
|
96
|
+
video.pause();
|
|
97
|
+
this.stopStream(video.srcObject);
|
|
98
|
+
video.remove();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async capture(options) {
|
|
102
|
+
return new Promise((resolve, reject) => {
|
|
103
|
+
const video = document.getElementById('video');
|
|
104
|
+
if (!video || !video.srcObject) {
|
|
105
|
+
reject({ message: 'camera is not running' });
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// video.width = video.offsetWidth;
|
|
109
|
+
let base64EncodedImage;
|
|
110
|
+
if (video && video.videoWidth > 0 && video.videoHeight > 0) {
|
|
111
|
+
const canvas = document.createElement('canvas');
|
|
112
|
+
const context = canvas.getContext('2d');
|
|
113
|
+
canvas.width = video.videoWidth;
|
|
114
|
+
canvas.height = video.videoHeight;
|
|
115
|
+
// flip horizontally back camera isn't used
|
|
116
|
+
if (!this.isBackCamera) {
|
|
117
|
+
context.translate(video.videoWidth, 0);
|
|
118
|
+
context.scale(-1, 1);
|
|
119
|
+
}
|
|
120
|
+
context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
|
|
121
|
+
if ((options.format || 'jpeg') === 'jpeg') {
|
|
122
|
+
base64EncodedImage = canvas
|
|
123
|
+
.toDataURL('image/jpeg', (options.quality || 85) / 100.0)
|
|
124
|
+
.replace('data:image/jpeg;base64,', '');
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
base64EncodedImage = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
resolve({
|
|
131
|
+
value: base64EncodedImage,
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
async captureSample(_options) {
|
|
136
|
+
return this.capture(_options);
|
|
137
|
+
}
|
|
138
|
+
async getSupportedFlashModes() {
|
|
139
|
+
throw new Error('getSupportedFlashModes not supported under the web platform');
|
|
140
|
+
}
|
|
141
|
+
async getHorizontalFov() {
|
|
142
|
+
throw new Error('getHorizontalFov not supported under the web platform');
|
|
143
|
+
}
|
|
144
|
+
async setFlashMode(_options) {
|
|
145
|
+
throw new Error('setFlashMode not supported under the web platform' + _options);
|
|
146
|
+
}
|
|
147
|
+
async flip() {
|
|
148
|
+
throw new Error('flip not supported under the web platform');
|
|
149
|
+
}
|
|
150
|
+
async setOpacity(_options) {
|
|
151
|
+
const video = document.getElementById('video');
|
|
152
|
+
if (!!video && !!_options['opacity']) {
|
|
153
|
+
video.style.setProperty('opacity', _options['opacity'].toString());
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
var web = /*#__PURE__*/Object.freeze({
|
|
159
|
+
__proto__: null,
|
|
160
|
+
CameraPreviewWeb: CameraPreviewWeb
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
exports.CameraPreview = CameraPreview;
|
|
164
|
+
|
|
165
|
+
return exports;
|
|
166
|
+
|
|
167
|
+
})({}, capacitorExports);
|
|
168
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +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 name: 'CameraPreview',\n platforms: ['web'],\n });\n }\n async start(options) {\n var _a;\n await navigator.mediaDevices\n .getUserMedia({\n audio: !options.disableAudio,\n video: true,\n })\n .then((stream) => {\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 })\n .catch((error) => {\n Promise.reject(error);\n });\n const video = document.getElementById('video');\n const parent = document.getElementById(options.parent);\n if (!video) {\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 === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) {\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 const self = this;\n await navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {\n if (document.getElementById('video')) {\n //video.src = window.URL.createObjectURL(stream);\n videoElement.srcObject = stream;\n videoElement.play();\n Promise.resolve({});\n }\n else {\n self.stopStream(stream);\n Promise.reject({ message: 'camera already stopped' });\n }\n }, (err) => {\n Promise.reject(err);\n });\n }\n }\n else {\n Promise.reject({ message: 'camera already started' });\n }\n }\n stopStream(stream) {\n if (stream) {\n const tracks = stream.getTracks();\n for (const track of tracks) {\n track.stop();\n }\n }\n }\n async stop() {\n const video = document.getElementById('video');\n if (video) {\n video.pause();\n this.stopStream(video.srcObject);\n video.remove();\n }\n }\n async capture(options) {\n return new Promise((resolve, reject) => {\n const video = document.getElementById('video');\n if (!video || !video.srcObject) {\n reject({ message: 'camera is not running' });\n return;\n }\n // video.width = video.offsetWidth;\n let base64EncodedImage;\n if (video && video.videoWidth > 0 && video.videoHeight > 0) {\n const canvas = document.createElement('canvas');\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 if ((options.format || 'jpeg') === 'jpeg') {\n base64EncodedImage = canvas\n .toDataURL('image/jpeg', (options.quality || 85) / 100.0)\n .replace('data:image/jpeg;base64,', '');\n }\n else {\n base64EncodedImage = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');\n }\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 getHorizontalFov() {\n throw new Error('getHorizontalFov not supported under the web platform');\n }\n async setFlashMode(_options) {\n throw new Error('setFlashMode not supported under the web platform' + _options);\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}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|