Gathering detailed insights and metrics for react-native-camera-kit
Gathering detailed insights and metrics for react-native-camera-kit
Gathering detailed insights and metrics for react-native-camera-kit
Gathering detailed insights and metrics for react-native-camera-kit
expo-react-native-camera-kit
[Expo Plugin](https://docs.expo.dev/config-plugins/introduction) to integrate Expo managed workflow with [react-native-camera-kit](https://github.com/teslamotors/react-native-camera-kit) without having to eject
@react-native-camera-roll/camera-roll
React Native Camera Roll for iOS & Android
react-native-camera
A Camera component for React Native. Also reads barcodes.
react-native-vision-camera
A powerful, high-performance React Native Camera library.
npm install react-native-camera-kit
Module System
Min. Node Version
Typescript Support
Node Version
NPM Version
2,492 Stars
1,048 Commits
590 Forks
209 Watching
12 Branches
80 Contributors
Updated on 26 Nov 2024
Swift (43.92%)
Kotlin (23.85%)
TypeScript (15.32%)
Objective-C++ (6.82%)
Java (3.29%)
Objective-C (3.22%)
JavaScript (2.09%)
Ruby (1.31%)
Shell (0.1%)
C (0.08%)
Cumulative downloads
Total Downloads
Last day
-2.8%
3,536
Compared to previous day
Last week
-1.2%
18,215
Compared to previous week
Last month
5.5%
75,241
Compared to previous month
Last year
85.4%
856,319
Compared to previous year
2
18
A high performance, easy to use, rock solid
camera library for React Native apps.
|
1yarn add react-native-camera-kit
1cd ios && pod install && cd ..
Android: Review your Kotlin configuration to ensure it's compatible with this library.
You must use a separate library for prompting the user for permissions before rendering the <Camera .../>
component.
We recommend zoontek's library, react-native-permissions:
https://github.com/zoontek/react-native-permissions#ios-flow
If you fail to prompt for permission, the camera will appear blank / black.
Conceptually, permissions are simple: Granted / Denied.
However, in reality it's not that simple due to privacy enhancements on iOS and Android.
Here's an example diagram from react-native-permissions's README, which illustrates the complexity of the user-experience, which we don't want to duplicate in a camera library:
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ check(PERMISSIONS.IOS.CAMERA) ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
│
Is the feature available
on this device ?
│ ╔════╗
├───────────║ NO ║──────────────┐
│ ╚════╝ │
╔═════╗ ▼
║ YES ║ ┌─────────────────────┐
╚═════╝ │ RESULTS.UNAVAILABLE │
│ └─────────────────────┘
Is the permission
requestable ?
│ ╔════╗
├───────────║ NO ║──────────────┐
│ ╚════╝ │
╔═════╗ ▼
║ YES ║ ┌───────────────────┐
╚═════╝ │ RESULTS.BLOCKED / │
│ │ RESULTS.LIMITED / │
│ │ RESULTS.GRANTED │
▼ └───────────────────┘
┌────────────────┐
│ RESULTS.DENIED │
└────────────────┘
│
▼
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ request(PERMISSIONS.IOS.CAMERA) ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
│
Does the user accept
the request ?
│ ╔════╗
├───────────║ NO ║──────────────┐
│ ╚════╝ │
╔═════╗ ▼
║ YES ║ ┌─────────────────┐
╚═════╝ │ RESULTS.BLOCKED │
│ └─────────────────┘
▼
┌─────────────────┐
│ RESULTS.GRANTED │
└─────────────────┘
In earlier versions of react-native-camera-kit, permissions were provided with an API, but for the above reasons, these APIs will be removed.
Add the following uses-permission to your AndroidManifest.xml
(usually found at: android/src/main/
)
1<uses-permission android:name="android.permission.CAMERA" /> 2<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Add the following usage descriptions to your Info.plist
(usually found at: ios/PROJECT_NAME/
)
1<key>NSCameraUsageDescription</key> 2<string>For taking photos</string> 3 4<key>NSPhotoLibraryUsageDescription</key> 5<string>For saving photos</string>
yarn bootstrap
yarn example ios
or yarn example android
Barebones camera component if you need advanced/customized interface
1import { Camera, CameraType } from 'react-native-camera-kit';
1<Camera 2 ref={(ref) => (this.camera = ref)} 3 cameraType={CameraType.Back} // front/back(default) 4 flashMode="auto" 5/>
Additionally, the Camera can be used for barcode scanning
1<Camera 2 ... 3 // Barcode props 4 scanBarcode={true} 5 onReadCode={(event) => Alert.alert('QR code found')} // optional 6 showFrame={true} // (default false) optional, show frame with transparent layer (qr code or barcode will be read on this area ONLY), start animation for scanner, that stops when a code has been found. Frame always at center of the screen 7 laserColor='red' // (default red) optional, color of laser in scanner frame 8 frameColor='white' // (default white) optional, color of border of scanner frame 9/>
Props | Type | Description |
---|---|---|
ref | Ref | Reference on the camera view |
style | StyleProp<ViewStyle> | Style to apply on the camera view |
flashMode | 'on' /'off' /'auto' | Camera flash mode. Default: auto |
focusMode | 'on' /'off' | Camera focus mode. Default: on |
zoomMode | 'on' /'off' | Enable the pinch to zoom gesture. Default: on |
zoom | number | Control the zoom. Default: 1.0 |
maxZoom | number | Maximum zoom allowed (but not beyond what camera allows). Default: undefined (camera default max) |
onZoom | Function | Callback when user makes a pinch gesture, regardless of what the zoom prop was set to. Returned event contains zoom . Ex: onZoom={(e) => console.log(e.nativeEvent.zoom)} . |
torchMode | 'on' /'off' | Toggle flash light when camera is active. Default: off |
cameraType | CameraType.Back/CameraType.Front | Choose what camera to use. Default: CameraType.Back |
onOrientationChange | Function | Callback when physical device orientation changes. Returned event contains orientation . Ex: onOrientationChange={(event) => console.log(event.nativeEvent.orientation)} . Use import { Orientation } from 'react-native-camera-kit'; if (event.nativeEvent.orientation === Orientation.PORTRAIT) { ... } to understand the new value |
Android only | ||
onError | Function | Android only. Callback when camera fails to initialize. Ex: onError={(e) => console.log(e.nativeEvent.errorMessage)} . |
shutterPhotoSound | boolean | Android only. Enable or disable the shutter sound when capturing a photo. Default: true |
iOS only | ||
ratioOverlay | 'int:int' | Show a guiding overlay in the camera preview for the selected ratio. Does not crop image as of v9.0. Example: '16:9' |
ratioOverlayColor | Color | Any color with alpha. Default: '#ffffff77' |
resetFocusTimeout | number | Dismiss tap to focus after this many milliseconds. Default 0 (disabled). Example: 5000 is 5 seconds. |
resetFocusWhenMotionDetected | Boolean | Dismiss tap to focus when focus area content changes. Native iOS feature, see documentation: https://developer.apple.com/documentation/avfoundation/avcapturedevice/1624644-subjectareachangemonitoringenabl?language=objc). Default true . |
resizeMode | 'cover' / 'contain' | Determines the scaling and cropping behavior of content within the view. cover (resizeAspectFill on iOS) scales the content to fill the view completely, potentially cropping content if its aspect ratio differs from the view. contain (resizeAspect on iOS) scales the content to fit within the view's bounds without cropping, ensuring all content is visible but may introduce letterboxing. Default behavior depends on the specific use case. |
scanThrottleDelay | number | Duration between scan detection in milliseconds. Default 2000 (2s) |
maxPhotoQualityPrioritization | 'balanced' / 'quality' / 'speed' | iOS 13 and newer. 'speed' provides a 60-80% median capture time reduction vs 'quality' setting. Tested on iPhone 6S Max (66% faster) and iPhone 15 Pro Max (76% faster!). Default balanced |
onCaptureButtonPressIn | Function | Callback when iPhone capture button is pressed in. Ex: onCaptureButtonPressIn={() => console.log("volume button pressed in")} |
onCaptureButtonPressOut | Function | Callback when iPhone capture button is released. Ex: onCaptureButtonPressOut={() => console.log("volume button released")} |
Barcode only | ||
scanBarcode | boolean | Enable barcode scanner. Default: false |
showFrame | boolean | Show frame in barcode scanner. Default: false |
laserColor | Color | Color of barcode scanner laser visualization. Default: red |
frameColor | Color | Color of barcode scanner frame visualization. Default: yellow |
onReadCode | Function | Callback when scanner successfully reads barcode. Returned event contains codeStringValue . Default: null . Ex: onReadCode={(event) => console.log(event.nativeEvent.codeStringValue)} |
Note: Must be called on a valid camera ref
Capture image as JPEG.
A temporary file is created. You must move this file to a permanent location (e.g. the app's 'Documents' folder) if you need it beyond the current session of the app as it may be deleted when the user leaves the app. You can move files by using a file system library such as react-native-fs or expo-filesystem.
(On Android we currently have an unsupported outputPath
prop but it's subject to change at any time).
Note that the reason you're getting a URL despite it being a file is because Android 10+ encourages URIs. To keep things consistent regardless of settings or platform we always send back a URI.
1const { uri } = await this.camera.capture(); 2// uri = 'file:///data/user/0/com.myorg.myapp/cache/ckcap123123123123.jpg'
If you want to store it permanently, here's an example using react-native-fs:
1import RNFS from 'react-native-fs'; 2// [...] 3let { uri } = await this.camera.capture(); 4if (uri.startsWith('file://')) { 5 // Platform dependent, iOS & Android uses '/' 6 const pathSplitter = '/'; 7 // file:///foo/bar.jpg => /foo/bar.jpg 8 const filePath = uri.replace('file://', ''); 9 // /foo/bar.jpg => [foo, bar.jpg] 10 const pathSegments = filePath.split(pathSplitter); 11 // [foo, bar.jpg] => bar.jpg 12 const fileName = pathSegments[pathSegments.length - 1]; 13 14 await RNFS.moveFile(filePath, `${RNFS.DocumentDirectoryPath}/${fileName}`); 15 uri = `file://${destFilePath}`; 16}
1const isCameraAuthorized = await Camera.checkDeviceCameraAuthorizationStatus();
return values:
AVAuthorizationStatusAuthorized
returns true
AVAuthorizationStatusNotDetermined
returns -1
otherwise, returns false
1const isUserAuthorizedCamera = await Camera.requestDeviceCameraAuthorization();
AVAuthorizationStatusAuthorized
returns true
otherwise, returns false
If you are using Expo Managed Workflow, you can use this library with a third-party plugin expo-react-native-camera-kit
.
The MIT License.
See LICENSE
No vulnerabilities found.
Reason
9 commit(s) and 13 issue activity found in the last 90 days -- score normalized to 10
Reason
no dangerous workflow patterns detected
Reason
license file detected
Details
Reason
binaries present in source code
Details
Reason
Found 5/16 approved changesets -- score normalized to 3
Reason
detected GitHub workflow tokens with excessive permissions
Details
Reason
no effort to earn an OpenSSF best practices badge detected
Reason
security policy file not detected
Details
Reason
dependency not pinned by hash detected -- score normalized to 0
Details
Reason
project is not fuzzed
Details
Reason
SAST tool is not run on all commits -- score normalized to 0
Details
Reason
15 existing vulnerabilities detected
Details
Score
Last Scanned on 2024-11-18
The Open Source Security Foundation is a cross-industry collaboration to improve the security of open source software (OSS). The Scorecard provides security health metrics for open source projects.
Learn More