Skip to content

Commit 1c62749

Browse files
rozelesibelius
authored andcommitted
Adds react-native-windows UWP support (react-native-camera#862)
* Adds react-native-windows UWP support This adds basic support for capturing photos and videos from either the front or back panel cameras, with some support for video quality, orientation, etc. This also uses ZXing.Net to support barcode scanning from the video preview frames. It also supports torch and flash modes. Videos and photos saved to disk (or camera roll / temporary folder) also supports some file metadata (e.g., lat/long). There are a number of features that have not yet been implemented: - Support `playSoundOnCapture` for default shutter sounds - Add orientation metadata properties on photo / video files - Support all barcode formats in ZXing.Net - Additional file metadata (like description) - Photo quality settings with `quality` and `jpegQuality` - Image post-processing with `mirrorImage` and `fixOrientation` - Support event listeners for `onZoomChanged` & `onFocusChanged` - Device authorization checks as supported on iOS * Updating NuGet packages for RNCamera UWP project * Minor fixes for legacy RCTCamera implementation * hack(CameraForView): default camera to any when panel info not available
1 parent dd843bd commit 1c62749

17 files changed

+1987
-0
lines changed

src/Camera.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ export default class Camera extends Component {
230230
this.cameraBarCodeReadListener = Platform.select({
231231
ios: NativeAppEventEmitter.addListener('CameraBarCodeRead', this._onBarCodeRead),
232232
android: DeviceEventEmitter.addListener('CameraBarCodeReadAndroid', this._onBarCodeRead),
233+
windows: DeviceEventEmitter.addListener('CameraBarCodeReadWindows', this._onBarCodeRead),
233234
});
234235
}
235236
}
@@ -315,6 +316,10 @@ export default class Camera extends Component {
315316
...options,
316317
};
317318

319+
if (Platform.OS === 'windows') {
320+
options['view'] = this._cameraHandle;
321+
}
322+
318323
if (options.mode === Camera.constants.CaptureMode.video) {
319324
options.totalSeconds = options.totalSeconds > -1 ? options.totalSeconds : -1;
320325
options.preferredTimeScale = options.preferredTimeScale || 30;
@@ -367,6 +372,10 @@ export default class Camera extends Component {
367372
return CameraManager.hasFlash({
368373
type: props.type,
369374
});
375+
} else if (Platform.OS === 'windows') {
376+
return CameraManager.hasFlash({
377+
view: this._cameraHandle,
378+
});
370379
}
371380
return CameraManager.hasFlash();
372381
}

windows/.gitignore

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
*AppPackages*
2+
*BundleArtifacts*
3+
*ReactAssets*
4+
5+
#OS junk files
6+
[Tt]humbs.db
7+
*.DS_Store
8+
9+
#Visual Studio files
10+
*.[Oo]bj
11+
*.user
12+
*.aps
13+
*.pch
14+
*.vspscc
15+
*.vssscc
16+
*_i.c
17+
*_p.c
18+
*.ncb
19+
*.suo
20+
*.tlb
21+
*.tlh
22+
*.bak
23+
*.[Cc]ache
24+
*.ilk
25+
*.log
26+
*.lib
27+
*.sbr
28+
*.sdf
29+
*.opensdf
30+
*.opendb
31+
*.unsuccessfulbuild
32+
ipch/
33+
[Oo]bj/
34+
[Bb]in
35+
[Dd]ebug*/
36+
[Rr]elease*/
37+
Ankh.NoLoad
38+
39+
#MonoDevelop
40+
*.pidb
41+
*.userprefs
42+
43+
#Tooling
44+
_ReSharper*/
45+
*.resharper
46+
[Tt]est[Rr]esult*
47+
*.sass-cache
48+
49+
#Project files
50+
[Bb]uild/
51+
52+
#Subversion files
53+
.svn
54+
55+
# Office Temp Files
56+
~$*
57+
58+
# vim Temp Files
59+
*~
60+
61+
#NuGet
62+
packages/
63+
*.nupkg
64+
65+
#ncrunch
66+
*ncrunch*
67+
*crunch*.local.xml
68+
69+
# visual studio database projects
70+
*.dbmdl
71+
72+
#Test files
73+
*.testsettings
74+
75+
#Other files
76+
*.DotSettings
77+
.vs/
78+
*project.lock.json

windows/.npmignore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
# Make sure we don't publish build artifacts to NPM
3+
ARM/
4+
Debug/
5+
x64/
6+
x86/
7+
bin/
8+
obj/
9+
.vs/

windows/RNCamera.sln

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
Microsoft Visual Studio Solution File, Format Version 12.00
2+
# Visual Studio 15
3+
VisualStudioVersion = 15.0.26730.3
4+
MinimumVisualStudioVersion = 10.0.40219.1
5+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RNCamera", "RNCamera\RNCamera.csproj", "{F11038F0-88E5-11E7-BA7C-E36C7490591A}"
6+
EndProject
7+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactNative", "..\node_modules\react-native-windows\ReactWindows\ReactNative\ReactNative.csproj", "{C7673AD5-E3AA-468C-A5FD-FA38154E205C}"
8+
EndProject
9+
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "ReactNative.Shared", "..\node_modules\react-native-windows\ReactWindows\ReactNative.Shared\ReactNative.Shared.shproj", "{EEA8B852-4D07-48E1-8294-A21AB5909FE5}"
10+
EndProject
11+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ChakraBridge", "..\node_modules\react-native-windows\ReactWindows\ChakraBridge\ChakraBridge.vcxproj", "{4B72C796-16D5-4E3A-81C0-3E36F531E578}"
12+
EndProject
13+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactNativeWebViewBridge", "..\node_modules\react-native-windows\ReactWindows\ReactNativeWebViewBridge\ReactNativeWebViewBridge.csproj", "{7596216B-669C-41F8-86DA-F3637F6545C0}"
14+
EndProject
15+
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Facebook.Yoga.Shared", "..\node_modules\react-native-windows\Yoga\csharp\Facebook.Yoga\Facebook.Yoga.Shared.shproj", "{91C42D32-291D-4B72-90B4-551663D60B8B}"
16+
EndProject
17+
Global
18+
GlobalSection(SharedMSBuildProjectFiles) = preSolution
19+
..\node_modules\react-native-windows\Yoga\csharp\Facebook.Yoga\Facebook.Yoga.Shared.projitems*{91c42d32-291d-4b72-90b4-551663d60b8b}*SharedItemsImports = 13
20+
..\node_modules\react-native-windows\ReactWindows\ReactNative.Shared\ReactNative.Shared.projitems*{c7673ad5-e3aa-468c-a5fd-fa38154e205c}*SharedItemsImports = 4
21+
..\node_modules\react-native-windows\Yoga\csharp\Facebook.Yoga\Facebook.Yoga.Shared.projitems*{c7673ad5-e3aa-468c-a5fd-fa38154e205c}*SharedItemsImports = 4
22+
..\node_modules\react-native-windows\ReactWindows\ReactNative.Shared\ReactNative.Shared.projitems*{eea8b852-4d07-48e1-8294-a21ab5909fe5}*SharedItemsImports = 13
23+
EndGlobalSection
24+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
25+
Debug|ARM = Debug|ARM
26+
Debug|x64 = Debug|x64
27+
Debug|x86 = Debug|x86
28+
Development|ARM = Development|ARM
29+
Development|x64 = Development|x64
30+
Development|x86 = Development|x86
31+
Release|ARM = Release|ARM
32+
Release|x64 = Release|x64
33+
Release|x86 = Release|x86
34+
EndGlobalSection
35+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
36+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Debug|ARM.ActiveCfg = Debug|ARM
37+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Debug|ARM.Build.0 = Debug|ARM
38+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Debug|x64.ActiveCfg = Debug|x64
39+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Debug|x64.Build.0 = Debug|x64
40+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Debug|x86.ActiveCfg = Debug|x86
41+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Debug|x86.Build.0 = Debug|x86
42+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Development|ARM.ActiveCfg = Development|ARM
43+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Development|ARM.Build.0 = Development|ARM
44+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Development|x64.ActiveCfg = Development|x64
45+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Development|x64.Build.0 = Development|x64
46+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Development|x86.ActiveCfg = Development|x86
47+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Development|x86.Build.0 = Development|x86
48+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Release|ARM.ActiveCfg = Release|ARM
49+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Release|ARM.Build.0 = Release|ARM
50+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Release|x64.ActiveCfg = Release|x64
51+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Release|x64.Build.0 = Release|x64
52+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Release|x86.ActiveCfg = Release|x86
53+
{F11038F0-88E5-11E7-BA7C-E36C7490591A}.Release|x86.Build.0 = Release|x86
54+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.ActiveCfg = Debug|ARM
55+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.Build.0 = Debug|ARM
56+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.ActiveCfg = Debug|x64
57+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.Build.0 = Debug|x64
58+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.ActiveCfg = Debug|x86
59+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.Build.0 = Debug|x86
60+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|ARM.ActiveCfg = Debug|ARM
61+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|ARM.Build.0 = Debug|ARM
62+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|x64.ActiveCfg = Debug|x64
63+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|x64.Build.0 = Debug|x64
64+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|x86.ActiveCfg = Debug|x86
65+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|x86.Build.0 = Debug|x86
66+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.ActiveCfg = Release|ARM
67+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.Build.0 = Release|ARM
68+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.ActiveCfg = Release|x64
69+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.Build.0 = Release|x64
70+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.ActiveCfg = Release|x86
71+
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.Build.0 = Release|x86
72+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.ActiveCfg = Debug|ARM
73+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.Build.0 = Debug|ARM
74+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.ActiveCfg = Debug|x64
75+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.Build.0 = Debug|x64
76+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.ActiveCfg = Debug|Win32
77+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.Build.0 = Debug|Win32
78+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|ARM.ActiveCfg = Debug|ARM
79+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|ARM.Build.0 = Debug|ARM
80+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|x64.ActiveCfg = Debug|x64
81+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|x64.Build.0 = Debug|x64
82+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|x86.ActiveCfg = Debug|Win32
83+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|x86.Build.0 = Debug|Win32
84+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.ActiveCfg = Release|ARM
85+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.Build.0 = Release|ARM
86+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.ActiveCfg = Release|x64
87+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.Build.0 = Release|x64
88+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.ActiveCfg = Release|Win32
89+
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.Build.0 = Release|Win32
90+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|ARM.ActiveCfg = Debug|ARM
91+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|ARM.Build.0 = Debug|ARM
92+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x64.ActiveCfg = Debug|x64
93+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x64.Build.0 = Debug|x64
94+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x86.ActiveCfg = Debug|x86
95+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x86.Build.0 = Debug|x86
96+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|ARM.ActiveCfg = Debug|ARM
97+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|ARM.Build.0 = Debug|ARM
98+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|x64.ActiveCfg = Debug|x64
99+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|x64.Build.0 = Debug|x64
100+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|x86.ActiveCfg = Debug|x86
101+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|x86.Build.0 = Debug|x86
102+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|ARM.ActiveCfg = Release|ARM
103+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|ARM.Build.0 = Release|ARM
104+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x64.ActiveCfg = Release|x64
105+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x64.Build.0 = Release|x64
106+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x86.ActiveCfg = Release|x86
107+
{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x86.Build.0 = Release|x86
108+
EndGlobalSection
109+
GlobalSection(SolutionProperties) = preSolution
110+
HideSolutionNode = FALSE
111+
EndGlobalSection
112+
GlobalSection(ExtensibilityGlobals) = postSolution
113+
SolutionGuid = {B259F75D-E772-4C88-973E-F0EF45B3F422}
114+
EndGlobalSection
115+
EndGlobal
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using System;
2+
using ZXing;
3+
4+
namespace RNCamera
5+
{
6+
static class BarcodeFormatExtensions
7+
{
8+
public static string GetName(this BarcodeFormat barcodeFormat)
9+
{
10+
switch (barcodeFormat)
11+
{
12+
case BarcodeFormat.AZTEC:
13+
return "aztec";
14+
case BarcodeFormat.CODE_39:
15+
return "code39";
16+
case BarcodeFormat.CODE_93:
17+
return "code93";
18+
case BarcodeFormat.CODE_128:
19+
return "code128";
20+
case BarcodeFormat.DATA_MATRIX:
21+
return "datamatrix";
22+
case BarcodeFormat.EAN_8:
23+
return "ean8";
24+
case BarcodeFormat.EAN_13:
25+
return "ean13";
26+
case BarcodeFormat.ITF:
27+
return "interleaved2of5";
28+
case BarcodeFormat.PDF_417:
29+
return "pdf417";
30+
case BarcodeFormat.QR_CODE:
31+
return "qr";
32+
case BarcodeFormat.UPC_E:
33+
return "upce";
34+
default:
35+
throw new NotImplementedException();
36+
}
37+
}
38+
}
39+
}

0 commit comments

Comments
 (0)