Skip to content

Latest commit

 

History

History
468 lines (356 loc) · 15.8 KB

installation.md

File metadata and controls

468 lines (356 loc) · 15.8 KB
id title
installation
Installation

This document is split into two main sections:

  1. Required installation steps for basic usage of react-native-camera
  2. Additional installation steps for usage of Face Detection/Text Recognition/BarCode with MLKit

Required installation steps

These steps assume installation for iOS/Android. To install it with Windows, see Windows below

Mostly automatic install with autolinking (RN > 0.60)

  1. npm install react-native-camera --save
  2. Run cd ios && pod install && cd ..

Mostly automatic install with react-native link (RN < 0.60)

  1. npm install react-native-camera --save
  2. react-native link react-native-camera

Manual install - iOS (not recommended)

  1. npm install react-native-camera --save
  2. In XCode, in the project navigator, right click LibrariesAdd Files to [your project's name]
  3. Go to node_modulesreact-native-camera and add RNCamera.xcodeproj
  4. Expand the RNCamera.xcodeprojProducts folder
  5. In XCode, in the project navigator, select your project. Add libRNCamera.a to your project's Build PhasesLink Binary With Libraries
  6. Click 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.

Manual install - Android (not recommended)

  1. npm install react-native-camera --save
  2. Open up android/app/src/main/java/[...]/MainApplication.java
  • Add import org.reactnative.camera.RNCameraPackage; to the imports at the top of the file
  • Add new RNCameraPackage() to the list returned by the getPackages() method. Add a comma to the previous item if there's already something there.
  1. 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')
  1. Insert the following lines in android/app/build.gradle inside the dependencies block:
implementation project(':react-native-camera')

iOS - other required steps

Add permissions with usage descriptions to your app Info.plist:

<!-- Required with iOS 10 and higher -->
<key>NSCameraUsageDescription</key>
<string>Your message to user when the camera is accessed for the first time</string>

<!-- Required with iOS 11 and higher: 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>

<!-- 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>
Additional information in case of problems

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

Android - other required steps

Add permissions to your app android/app/src/main/AndroidManifest.xml file:

<!-- Required -->
<uses-permission android:name="android.permission.CAMERA" />

<!-- Include this only if you are planning to use the camera roll -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<!-- Include this only if you are planning to use the microphone for video recording -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>

Insert the following lines in android/app/build.gradle:

android {
  ...
  defaultConfig {
    ...
    missingDimensionStrategy 'react-native-camera', 'general' // <--- insert this line
  }
}
Additional information in case of problems
  1. Make sure you use JDK >= 1.7 and your buildToolsVersion >= 25.0.2

  2. Make sure you have jitpack added in android/build.gradle

allprojects {
    repositories {
        maven { url "https://www.jitpack.io" }
        maven { url "https://maven.google.com" }
    }
}

Additional installation steps

Follow these optional steps if you want to use Face Detection/Text Recognition/BarCode with MLKit. You will need to set-up Firebase project for your app (detailed steps below).

Note: Installing react-native-firebase package is NOT necessary.

iOS

If you want any of these optional features, you will need to use CocoaPods.

Modifying Podfile

Add dependency towards react-native-camera in your Podfile with subspecs using one of the following:

  • For Face Detection:
pod 'react-native-camera', path: '../node_modules/react-native-camera', subspecs: [
  'FaceDetectorMLKit'
]
  • For Text Recognition:
pod 'react-native-camera', path: '../node_modules/react-native-camera', subspecs: [
  'TextDetector'
]
  • For BarCode Recognition:
pod 'react-native-camera', path: '../node_modules/react-native-camera', subspecs: [
  'BarcodeDetectorMLKit'
]
  • For all possible detections:
pod 'react-native-camera', path: '../node_modules/react-native-camera', subspecs: [
  'TextDetector',
  'FaceDetectorMLKit',
  'BarcodeDetectorMLKit'
]

Then run cd ios && pod install && cd ..

Setting up Firebase

Text/Face 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

  1. Register your app in Firebase console.
  2. Download GoogleService-Info.plist and add it to your project
  3. Add pod 'Firebase/Core' to your podfile
  4. In your AppDelegate.m file add the following lines:
#import <Firebase.h> // <--- add this
...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  [FIRApp configure]; // <--- add this
  ...
}
Additional information in case of problems
  • If you have issues with duplicate symbols you will need to enable dead code stripping option in your Xcode (Target > Build Settings > search for "Dead code stripping") see here.
  • If you are using pod Firebase/Core with a version set below 5.13 you might want to add pod 'GoogleAppMeasurement', '~> 5.3.0' to your podfile

Android

Modifying build.gradle

Modify the following lines in android/app/build.gradle:

android {
  ...
  defaultConfig {
    ...
    missingDimensionStrategy 'react-native-camera', 'mlkit' // <--- replace general with mlkit
  }
}

Setting up Firebase

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

  1. Register your app in Firebase console.
  2. Download google-services.json and place it in android/app/
  3. Add the folowing to project level build.gradle:
buildscript {
  dependencies {
  // Add this line
  classpath 'com.google.gms:google-services:4.0.1' // <--- you might want to use different version
  }
}
  1. add to the bottom of android/app/build.gradle file
apply plugin: 'com.google.gms.google-services'
  1. 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, face" /> <!-- choose models that you will use -->
</application>
Additional information in case of problems The current Android library defaults to the below values for the Google SDK and Libraries,
def DEFAULT_COMPILE_SDK_VERSION             = 29
def DEFAULT_BUILD_TOOLS_VERSION             = "29.0.2"
def DEFAULT_TARGET_SDK_VERSION              = 29
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           = 29
    targetSdkVersion            = 29
    buildToolsVersion           = "29.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:4.1.0'
  }
}

apply plugin: 'com.android.library'

android {
  compileSdkVersion safeExtGet('compileSdkVersion', 28)
  buildToolsVersion safeExtGet('buildToolsVersion', '28.0.3')

  defaultConfig {
    minSdkVersion safeExtGet('minSdkVersion', 16)
    targetSdkVersion safeExtGet('targetSdkVersion', 28)
  }

  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()
  jcenter()
  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 {
  def googlePlayServicesVisionVersion = safeExtGet('googlePlayServicesVisionVersion', safeExtGet('googlePlayServicesVersion', '17.0.2'))

  implementation 'com.facebook.react:react-native:+'
  implementation "com.google.zxing:core:3.3.3"
  implementation "com.drewnoakes:metadata-extractor:2.11.0"
  generalImplementation "com.google.android.gms:play-services-vision:$googlePlayServicesVisionVersion"
  implementation "com.android.support:exifinterface:${safeExtGet('supportLibVersion', '28.0.0')}"
  implementation "com.android.support:support-annotations:${safeExtGet('supportLibVersion', '28.0.0')}"
  implementation "com.android.support:support-v4:${safeExtGet('supportLibVersion', '28.0.0')}"
  mlkitImplementation "com.google.firebase:firebase-ml-vision:${safeExtGet('firebase-ml-vision', '19.0.3')}"
  mlkitImplementation "com.google.firebase:firebase-ml-vision-face-model:${safeExtGet('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           = 29
    targetSdkVersion            = 29
    buildToolsVersion           = "29.0.2"
    googlePlayServicesVersion   = "16.0.1"
    googlePlayServicesVisionVersion = "15.0.2"
    supportLibVersion           = "27.1.0"
}

Windows

Mostly automatic install with autolinking (RNW >= 0.63)

  1. npm install react-native-camera --save
  2. See Additional steps - Windows below

Manual install - Windows (RNW 0.62)

  1. npm install react-native-camera --save
  2. Link the library as described below:
    1. Add the ReactNativeCameraCPP project to your solution (eg. windows\yourapp.sln)
      1. Open your solution in Visual Studio 2019
      2. Right-click Solution icon in Solution Explorer > Add > Existing Project...
      3. Select node_modules\react-native-camera\windows\ReactNativeCameraCPP\ReactNativeCameraCPP.vcxproj
    2. Add a reference to ReactNativeCameraCPP to your main application project (eg. windows\yourapp\yourapp.vcxproj)
      1. Open your solution in Visual Studio 2019
      2. Right-click main application project > Add > Reference...
      3. Check ReactNativeCameraCPP from Solution Projects
  3. Modify files below to add the package providers to your main application project
    1. pch.h
      1. Add #include "winrt/ReactNativeCameraCPP.h"
    2. App.cpp
      1. Add PackageProviders().Append(winrt::ReactNativeCameraCPP::ReactPackageProvider()); before InitializeComponent();
  4. See Additional steps - Windows below

Manual install - Windows (RNW 0.61)

Follow Manual install - Windows (RNW 0.62) above, but for step 2 substitute ReactNativeCameraCPP61 for ReactNativeCameraCPP.

Additional steps - Windows

You need to declare that your app wants to access the camera:

  1. Add the capabilities (permissions) for the webcam and microphone as described here: Add capability declarations to the app manifest
  2. If you plan on capturing images to the Pictures Library, or videos to the Videos Library, be sure to enable those capabilities too

Follow the Q & A section if you are having compilation issues.