Security News
pnpm 10.0.0 Blocks Lifecycle Scripts by Default
pnpm 10 blocks lifecycle scripts by default to improve security, addressing supply chain attack risks but sparking debate over compatibility and workflow changes.
@chatium/react-native-camera
Advanced tools
A Camera component for React Native. Also reads barcodes.
If you use this library on your commercial/personal projects, you can help us by funding the work on specific issues that you choose by using IssueHunt.io!
This gives you the power to prioritize our work and support the project contributors. Moreover it'll guarantee the project will be updated and maintained in the long run.
You can also fund this project using open collective
Support us with a monthly donation and help us continue our activities. [Become a backer]
Become a sponsor and get your logo on our README on Github with a link to your site. [Become a sponsor]
The comprehensive camera module for React Native.
Supports:
Get supported react-native-camera with the Tidelift Subscription
import { RNCamera, FaceDetector } from 'react-native-camera';
We recommend using the releases from npm, however if you need some features that are not published on npm yet you can install react-native-camera from git.
yarn: yarn add react-native-camera@git+https://git@github.com/react-native-community/react-native-camera.git
npm: npm install --save react-native-camera@git+https://git@github.com/react-native-community/react-native-camera.git
To use the camera on Android you must ask for camera permission:
<uses-permission android:name="android.permission.CAMERA" />
To enable video recording
feature you have to add the following code to the AndroidManifest.xml
:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
See this doc
See this doc
<key>NSCameraUsageDescription</key>
<string>Your message to user when the camera is accessed for the first time</string>
<!-- Include this only if you are planning to use the camera roll -->
<key>NSPhotoLibraryUsageDescription</key>
<string>Your message to user when the photo library is accessed for the first time</string>
<!-- Include this only if you are planning to use the microphone for video recording -->
<key>NSMicrophoneUsageDescription</key>
<string>Your message to user when the microphone is accessed for the first time</string>
On Android, you require buildToolsVersion
of 25.0.2+
. This should easily and automatically be downloaded by Android Studio's SDK Manager.
On iOS 11 and later you need to add NSPhotoLibraryAddUsageDescription
key to the Info.plist. This key lets you describe the reason your app seeks write-only access to the user’s photo library. Info.plist can be found in 'your_project/ios/your_project/Info.plist'. Add the following code:
<!-- Include this only if you are planning to use the camera roll -->
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Your message to user when the photo library is accessed for the first time</string>
npm install react-native-camera --save
react-native link react-native-camera
To install it with Windows, see manual install belownpm install react-native-camera --save
pod 'react-native-camera', path: '../node_modules/react-native-camera'
pod install
Note: You might need to adjust your Podfile following the example below:
target 'yourTargetName' do
# See http://facebook.github.io/react-native/docs/integration-with-existing-apps.html#configuring-cocoapods-dependencies
pod 'React', :path => '../node_modules/react-native', :subspecs => [
'Core',
'CxxBridge', # Include this for RN >= 0.47
'DevSupport', # Include this to enable In-App Devmenu if RN >= 0.43
'RCTText',
'RCTNetwork',
'RCTWebSocket', # Needed for debugging
'RCTAnimation', # Needed for FlatList and animations running on native UI thread
# Add any other subspecs you want to use in your project
]
# Explicitly include Yoga if you are using RN >= 0.42.0
pod 'yoga', :path => '../node_modules/react-native/ReactCommon/yoga'
# Third party deps podspec link
pod 'react-native-camera', path: '../node_modules/react-native-camera'
end
post_install do |installer|
installer.pods_project.targets.each do |target|
if target.name == "React"
target.remove_from_project
end
end
end
npm install react-native-camera --save
Libraries
➜ Add Files to [your project's name]
node_modules
➜ react-native-camera
and add RNCamera.xcodeproj
RNCamera.xcodeproj
➜ Products
folderlibRNCamera.a
to your project's Build Phases
➜ Link Binary With Libraries
RNCamera.xcodeproj
in the project navigator and go the Build Settings
tab. Make sure 'All' is toggled on (instead of 'Basic'). In the Search Paths
section, look for Header Search Paths
and make sure it contains both $(SRCROOT)/../../react-native/React
and $(SRCROOT)/../../../React
- mark both as recursive
.Face Detection/Text Recognition are optional on iOS. If you want them, you are going to need to install Google Mobile Vision frameworks in your project, as mentioned in the next section.
If you do not need it and do not want to install the GMV frameworks, open your app xcode project, on the Project Navigator, expand the RNCamera project, right click on the FaceDetector folder and delete it (move to trash, if you want). If you keep that folder and do not follow the GMV installation steps, your project will not compile.
If you want to make this automatic, you can add a postinstall script to your app package.json
. Inside the postinstall_project
there is a xcode project ready with the folder removed (we opened xcode, removed the folder from the project and copied the resulting project file). The post install script is:
#!/bin/bash
echo "Creating project without FaceDetector"
if [ -e node_modules/react-native-camera/ios/FaceDetector ] ; then
rm -rf node_modules/react-native-camera/ios/FaceDetector
fi
cp node_modules/react-native-camera/postinstall_project/projectWithoutFaceDetection.pbxproj node_modules/react-native-camera/ios/RNCamera.xcodeproj/project.pbxproj
And add something like this to the scripts
section in your package.json
:
Note: The face detection/text recognition code is excluded by default for the CocoaPods installation.
"postinstall": "./scripts/post.sh",
GMV (Google Mobile Vision) is used for Face detection/Text recognition by the iOS RNCamera. You have to link the google frameworks to your project to successfully compile the RNCamera project.
Modify the dependency towards react-native-camera
in your
Podfile
, from
pod 'react-native-camera', path: '../node_modules/react-native-camera'
to (for Face Detection)
pod 'react-native-camera', path: '../node_modules/react-native-camera', subspecs: [
'FaceDetector'
]
or to (for Text Recognition)
pod 'react-native-camera', path: '../node_modules/react-native-camera', subspecs: [
'TextDetector'
]
Text recognition for iOS uses Firebase MLKit which requires setting up Firebase project for your app. If you have not already added Firebase to your app, please follow the steps described in getting started guide. In short, you would need to
GoogleService-Info.plist
and add it to your projectpod 'Firebase/Core'
to your podfileAppDelegate.m
file add the following lines:#import <Firebase.h> // <--- add this
...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[FIRApp configure]; // <--- add this
...
}
Note: Text recognition is currently available only via CocoaPods Path.
pod Firebase/Core
with a version set below 5.13 you might want to add pod 'GoogleAppMeasurement', '~> 5.3.0'
to your podfileDownload: Google Symbol Utilities: https://www.gstatic.com/cpdc/dbffca986f6337f8-GoogleSymbolUtilities-1.1.1.tar.gz
Google Utilities: https://dl.google.com/dl/cpdc/978f81964b50a7c0/GoogleUtilities-1.3.2.tar.gz
Google Mobile Vision: https://dl.google.com/dl/cpdc/df83c97cbca53eaf/GoogleMobileVision-1.1.0.tar.gz
Google network Utilities: https://dl.google.com/dl/cpdc/54fd7b7ef8fd3edc/GoogleNetworkingUtilities-1.2.2.tar.gz
Google Interchange Utilities: https://dl.google.com/dl/cpdc/1a7f7ba905b2c029/GoogleInterchangeUtilities-1.2.2.tar.gz
Extract everything to one folder. Delete "BarcodeDetector" and "copy" folders from Google Mobile Vision.
Open XCode, right click on your project and choose "New Group". Rename the new folder to "Frameworks". Right click on "Frameworks" and select "add files to 'YOUR_PROJECT'". Select all content from the folder of step 2, click on Options. Select "Copy items if needed", leave "Create groups" selected and choose all your targets on the "Add to targets" section. Then, click on "Add".
On your target -> Build Phases -> Link Binary with Libraries -> add AddressBook.framework
On your target -> Build Settings -> Other Linker Flags -> add -lz, -ObjC and -lc++
To force indexing and prevent errors, restart xcode and reopen your project again before compiling.
npm install react-native-camera --save
android/app/src/main/java/[...]/MainApplication.java
import org.reactnative.camera.RNCameraPackage;
to the imports at the top of the filenew RNCameraPackage()
to the list returned by the getPackages()
method. Add a comma to the previous item if there's already something there.Append the following lines to android/settings.gradle
:
include ':react-native-camera'
project(':react-native-camera').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-camera/android')
Insert the following lines in android/app/build.gradle
:
inside the dependencies block:
```gradle
implementation project(':react-native-camera')
```
inside defaultConfig block insert either:
android {
...
defaultConfig {
...
missingDimensionStrategy 'react-native-camera', 'general' <-- insert this line
}
}
or, if using MLKit for text/face/barcode recognition:
android {
...
defaultConfig {
...
missingDimensionStrategy 'react-native-camera', 'mlkit' <-- insert this line
}
}
video recording
feature)<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
allprojects {
repositories {
maven { url "https://jitpack.io" }
maven { url "https://maven.google.com" }
}
}
Additional steps for using MLKit for text/face/barcode recognition
7.1. Using Firebase MLKit requires seting up Firebase project for your app. If you have not already added Firebase to your app, please follow the steps described in getting started guide. In short, you would need to
android/app/
buildscript {
dependencies {
// Add this line
classpath 'com.google.gms:google-services:4.0.1' <-- you might want to use different version
}
}
android/app/build.gradle
fileapply plugin: com.google.gms.google-services'
7.2. Configure your app to automatically download the ML model to the device after your app is installed from the Play Store. If you do not enable install-time model downloads, the model will be downloaded the first time you run the on-device detector. Requests you make before the download has completed will produce no results.
<application ...>
...
<meta-data
android:name="com.google.firebase.ml.vision.DEPENDENCIES"
android:value="ocr" />
<!-- To use multiple models, list all needed models: android:value="ocr, face, barcode" -->
</application>
The current Android library defaults to the below values for the Google SDK and Libraries,
def DEFAULT_COMPILE_SDK_VERSION = 26
def DEFAULT_BUILD_TOOLS_VERSION = "26.0.2"
def DEFAULT_TARGET_SDK_VERSION = 26
def DEFAULT_GOOGLE_PLAY_SERVICES_VERSION = "12.0.1"
def DEFAULT_SUPPORT_LIBRARY_VERSION = "27.1.0"
You can override this settings by adding a Project-wide gradle configuration properties for
use by all modules in your ReactNative project by adding the below to android/build.gradle
file,
buildscript {...}
allprojects {...}
/**
* Project-wide gradle configuration properties for use by all modules
*/
ext {
compileSdkVersion = 26
targetSdkVersion = 26
buildToolsVersion = "26.0.2"
googlePlayServicesVersion = "12.0.1"
googlePlayServicesVisionVersion = "15.0.2"
supportLibVersion = "27.1.0"
}
The above settings in the ReactNative project over-rides the values present in the react-native-camera
module. For your reference below is the android/build.gradle
file of the module.
def safeExtGet(prop, fallback) {
rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
}
buildscript {
repositories {
google()
maven {
url 'https://maven.google.com'
}
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
}
}
apply plugin: 'com.android.library'
android {
compileSdkVersion safeExtGet('compileSdkVersion', 26)
buildToolsVersion safeExtGet('buildToolsVersion', '26.0.2')
defaultConfig {
minSdkVersion safeExtGet('minSdkVersion', 16)
targetSdkVersion safeExtGet('targetSdkVersion', 26)
}
flavorDimensions "react-native-camera"
productFlavors {
general {
dimension "react-native-camera"
}
mlkit {
dimension "react-native-camera"
}
}
sourceSets {
main {
java.srcDirs = ['src/main/java']
}
general {
java.srcDirs = ['src/general/java']
}
mlkit {
java.srcDirs = ['src/mlkit/java']
}
}
lintOptions {
abortOnError false
warning 'InvalidPackage'
}
}
repositories {
google()
mavenCentral()
maven {
url 'https://maven.google.com'
}
maven { url "https://jitpack.io" }
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url "$rootDir/../node_modules/react-native/android"
}
}
dependencies {
compileOnly 'com.facebook.react:react-native:+'
compileOnly 'com.facebook.infer.annotation:infer-annotation:+'
implementation "com.google.zxing:core:3.3.0"
implementation "com.drewnoakes:metadata-extractor:2.9.1"
generalImplementation "com.google.android.gms:play-services-vision:${safeExtGet('google-services', '17.0.2')}"
implementation "com.android.support:exifinterface:${safeExtGet('supportLibVersion', '27.1.0')}"
implementation "com.android.support:support-annotations:${safeExtGet('supportLibVersion', '27.1.0')}"
implementation "com.android.support:support-v4:${safeExtGet('supportLibVersion', '27.1.0')}"
mlkitImplementation "com.google.firebase:firebase-ml-vision:${safeExtGet('firebase-ml-vision', '18.0.2')}"
mlkitImplementation "com.google.firebase:firebase-ml-vision-face-model:17.0.2"
}
If you are using a version of googlePlayServicesVersion
that does not have play-services-vision
, you can specify a different version of play-services-vision
by adding googlePlayServicesVisionVersion
to the project-wide properties
ext {
compileSdkVersion = 26
targetSdkVersion = 26
buildToolsVersion = "26.0.2"
googlePlayServicesVersion = "16.0.1"
googlePlayServicesVisionVersion = "15.0.2"
supportLibVersion = "27.1.0"
}
npm install react-native-camera --save
MainReactNativeHost.cs
:using RNCamera;
protected override List<IReactPackage> Packages => new List<IReactPackage>
add a new line with new RNCameraPackage()
RCTCamera
(RNCamera is not supported yet) like described aboveFollow the Q & A section if you are having compilation issues.
Take a look into this documentation.
Since 1.0.0
, RCTCamera is deprecated, but if you want to use it, you can see its documentation.
Thanks to Brent Vatne (@brentvatne) for the react-native-video
module which provided me with a great example of how to set up this module.
FAQs
A Camera component for React Native. Also reads barcodes.
We found that @chatium/react-native-camera demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
pnpm 10 blocks lifecycle scripts by default to improve security, addressing supply chain attack risks but sparking debate over compatibility and workflow changes.
Product
Socket now supports uv.lock files to ensure consistent, secure dependency resolution for Python projects and enhance supply chain security.
Research
Security News
Socket researchers have discovered multiple malicious npm packages targeting Solana private keys, abusing Gmail to exfiltrate the data and drain Solana wallets.