/react-native-sensors

A developer friendly approach for sensors in React Native

Primary LanguageJavaScriptMIT LicenseMIT

react-native-sensors Build Status semantic-release codebeat badge BCH compliance All Contributors

Supported React Native Versions

React Native Version react-native-sensors Version
<= 39 < 1.0
>= 40 >= 1.0

Cool Projects using react-native-sensors

Do you want your project listed here? Just send a PR.

Getting started

$ npm install react-native-sensors --save

Automatic installation

$ react-native link react-native-sensors

Option: With CocoaPods (iOS only)

Add the following to your Podfile and run $ pod install:

pod 'RNSensors', :path => '../node_modules/react-native-sensors'

Manual installation

iOS

  1. In XCode, in the project navigator, right click Libraries ➜ Add Files to [your project's name]
  2. Go to node_modules ➜ react-native-sensors and add RNSensors.xcodeproj
  3. In XCode, in the project navigator, select your project. Add libRNSensors.a to your project's Build Phases ➜ Link Binary With Libraries
  4. Run your project (Cmd+R)<

Android

  1. Open up android/app/src/main/java/[...]/MainApplication.java
  • Add import com.sensors.RNSensorsPackage; to the imports at the top of the file
  • Add new RNSensorsPackage() to the list returned by the getPackages() method
  1. Append the following lines to android/settings.gradle:
    include ':react-native-sensors'
    project(':react-native-sensors').projectDir = new File(rootProject.projectDir, 	'../node_modules/react-native-sensors/android')
    
  2. Insert the following lines inside the dependencies block in android/app/build.gradle:
      implementation project(':react-native-sensors')
    

Running on Simulator

  • iOS simulators currently have no support for sensors. In order to retrieve any sensor output, you must develop on a real device
  • Android simulators offer support for some sensors. This article documents how to use them (see "Virtual Sensors" section)

Usage

Sensor API

import { Accelerometer, Gyroscope } from "react-native-sensors";

let accelerationObservable = null;
new Accelerometer({
  updateInterval: 400 // defaults to 100ms
})
  .then(observable => {
    accelerationObservable = observable;

    // Normal RxJS functions
    accelerationObservable
      .map(({ x, y, z }) => x + y + z)
      .filter(speed => speed > 20)
      .subscribe(speed => console.log(`You moved your phone with ${speed}`));
  })
  .catch(error => {
    console.log("The sensor is not available");
  });

setTimeout(() => {
  accelerationObservable.stop();
}, 1000);

Decorator usage

import React, { Component } from "react";
import { Text, View } from "react-native";
import { decorator as sensors } from "react-native-sensors";

class MyComponent {
  // no lifecycle needed
  render() {
    const { sensorsFound, Accelerometer, Gyroscope } = this.props;

    if (!Accelerometer || !Gyroscope) {
      // One of the sensors is still initializing
      return null;
    }

    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>
          {(sensorsFound["Accelerometer"] &&
            `Acceleration has value: ${Accelerometer}`) ||
            "Acceleration is not available"}
          {(sensorsFound["Gyroscope"] && `Gyro has value: ${Gyroscope}`) ||
            "Gyro is not available"}
        </Text>
      </View>
    );
  }
}

export default sensors({
  Accelerometer: {
    updateInterval: 300 // optional
  },
  Gyroscope: true
})(MyComponent);

FAQ

Accelerometer and/or Gyroscope show strange values

It seems like iOS and Android have these two swapped from what the common understanding of what an Accelerometer or a Gyroscope is. It might make sense to swap them to see if they now fit your perception. We chose against switching them out because we want to stay in line with the rest of the industy.

Changelog

Please see the changelog here

Credits

This project is inspired by the react-native-sensor-manager and by the react-native-motion-manager. Both have similar solutions with a non-uniform interface and this project aims to unify both.

Contributing

  • We use semantic-release for the deployment of new versions, so please stick to this format

Contributors

Thanks goes to these wonderful people (emoji key):


Daniel Schmidt

πŸ’»

Noitidart

πŸ“–

Christophe Lemonnier

πŸ’»

Gennady

πŸ“–

Jiaming Lu

πŸ’»

Alex Wasner

πŸ’»

Nam Đàm

πŸ’»

Mike Knapp

πŸ’»

Kevin Gonnord

πŸ’»

ImAtome

πŸ’»

Lisa Huynh

πŸ’»

Cory Smith

πŸ’»

Esa-Matti Suuronen

πŸ’»

Viet Nguyen

πŸ’»

Simon Bengtsson

πŸ’»

maxkomarychev

πŸ’»

Alexander Baygeldin

πŸ’»

Noane Dan

πŸ’»

David Escalera

πŸ’¬ πŸ’»

Ethan Neff

πŸ’»

Manuel Alabor

πŸ’»

Michael ElsdΓΆrfer

πŸ’»

jmichalc

πŸ’»

This project follows the all-contributors specification. Contributions of any kind welcome!