🎈 React Native Camera Kit
A high performance, easy to use, rock solid
camera library for React Native apps.
|
Cross Platform (iOS and Android)Optimized for performance and high photo capture rateQR / Barcode scanning supportCamera preview support in iOS simulator
|
Installation (RN > 0.60)
yarn add react-native-camera-kit
cd ios && pod install && cd ..
Android:
Add Kotlin to your project
Permissions
Android
Add the following uses-permission to your AndroidManifest.xml
(usually found at: android/src/main/
)
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
iOS
Add the following usage descriptions to your Info.plist
(usually found at: ios/PROJECT_NAME/
)
<key>NSCameraUsageDescription</key>
<string>For taking photos</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>For saving photos</string>
Running the example project
yarn bootstrap
yarn example ios
or yarn example android
Components
Camera
Barebones camera component if you need advanced/customized interface
import { Camera, CameraType } from 'react-native-camera-kit';
<Camera
ref={(ref) => (this.camera = ref)}
cameraType={CameraType.Back}
flashMode='auto'
/>
Barcode / QR Code Scanning
Additionally, the Camera can be used for barcode scanning
<Camera
...
scanBarcode={true}
onReadCode={(event) => Alert.alert('QR code found')}
showFrame={true}
laserColor='red'
frameColor='white'
/>
Camera Props (Optional)
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)} . |
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 . |
scanThrottleDelay | number | Duration between scan detection in milliseconds. Default 2000 (2s) |
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)} |
Imperative API
Note: Must be called on a valid camera ref
capture()
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.
const { uri } = await this.camera.capture();
If you want to store it permanently, here's an example using react-native-fs:
import RNFS from 'react-native-fs';
let { uri } = await this.camera.capture();
if (uri.startsWith('file://')) {
const pathSplitter = '/';
const filePath = uri.replace('file://', '');
const pathSegments = filePath.split(pathSplitter);
const fileName = pathSegments[pathSegments.length - 1];
await RNFS.moveFile(filePath, `${RNFS.DocumentDirectoryPath}/${fileName}`);
uri = `file://${destFilePath}`;
}
checkDeviceCameraAuthorizationStatus (iOS only)
const isCameraAuthorized = await Camera.checkDeviceCameraAuthorizationStatus();
return values:
AVAuthorizationStatusAuthorized
returns true
AVAuthorizationStatusNotDetermined
returns -1
otherwise, returns false
requestDeviceCameraAuthorization (iOS only)
const isUserAuthorizedCamera = await Camera.requestDeviceCameraAuthorization();
AVAuthorizationStatusAuthorized
returns true
otherwise, returns false
Contributing
- Pull Requests are welcome, if you open a pull request we will do our best to get to it in a timely manner
- Pull Request Reviews are even more welcome! we need help testing, reviewing, and updating open PRs
- If you are interested in contributing more actively, please contact us.
License
The MIT License.
See LICENSE