npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

react-native-activity-recognition-wrapper

v2.0.2

Published

A wrapper for the Activity Recognition and CoreMotion packages from Android and iOS, for use in a react native app with background capabilities - also includes support for activating individual device sensors (Android only, still in development for iOS)

Downloads

79

Readme

react-native-activity-recognition-wrapper

A wrapper for the Activity Recognition (Android) and CMMotionActivity (iOS) libraries.

***NOTE: This library is currently still in experimental phase and is constantly being worked on. For suggestions/questions, please email me on [email protected] and I will get back to you ASAP.

Installation

npm install react-native-activity-recognition-wrapper
or 
yarn add react-native-activity-recognition-wrapper

How it currently works and pre-requisites for your app

The updates of the user's motion are triggered by location changes, as this was a technical limitation imposed by iOS and in order to maintain consistency across the platforms, we have implemented the same in Android.

The package requests location updates from the operating system, at a distance interval(android) or distance filter(ios) that you specify (see below in usage). Whenever the package receives a location update, it then listens to the motion activity of the device for a specified amount of time (also see below in usage) and these updates are broadcasted to any listeners that are listening on the 'ACTIVITY_UPDATE' topic.

The prerequisites are the following:

Android:

These permissions need to be requested before the package is invoked, if they are not granted, do not call the package.

  1. ACTIVITY_RECOGNITION
  2. ACCESS_FINE_LOCATION
  3. ACCESS_COARSE_LOCATION These need to be added to your android manifest file, along with the following other items:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.reactnativeactivityrecognitionwrapper">
    <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="false" android:theme="@style/AppTheme">
        <!-- ... activity ... -->
        <service android:name=".service.ActivityDetectionIntentService" android:exported="false"></service>
        <service android:name=".service.BackgroundDetectedActivitiesService"></service>
    </application>
</manifest>

iOS:

You need to enable the Location Updates Background mode in your application (found under the main target of your application - Signing and Capabilities - Background Modes), then you need to add the following permission items to your info.plist file:

<dict>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>Display Message for Location When In Use Usage Description</string>
    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>Display Message Location Always and When In Use Usage Description</string>
</dict>

Usage

import { 
  enableActivityRecognitionTracking,
  stop,
  startSignificantLocationUpdates,
  startFrequentLocationUpdates
}  from 'react-native-activity-recognition-wrapper';

Initialising configuration for the package

We now need to initialise the parameters with which we want the service to run, namely the distance filter for location updates, and the time interval that we want to receive motion updates for.The function enableActivityRecognitionTracking must be called with 2 parameters, the first being the location update interval (distance filter - which will tell the OS after what displacement the app must be sent location updates (IN METERS)) and the second being the activity update interval (update duration - how long the activity updates must be sent to your app for, after the location displacement has been exceeded and the location updates have now been triggered (IN MILLISECONDS)) NOTE: this does not actually start the updates, it purely sets configuration parameters. Here's an example:

enableActivityRecognitionTracking(10, 10000)    

The example will tell the OS to let our app know once the user has moved by 10 meters, and thereafter start sending activity updates for 10 seconds. After the 10 seconds have passed, the activity updates will stop. When the distance filter (10 meters) is exceeded again, then the activity updates will start again etc.

The package then broadcasts the events via the native event emitter module to your app.

Start listening to location and activity updates

Now that we have configured the package, we have to tell the package to START listening to the location updates, and when a location update comes through, it will automatically start monitoring the user activity for the specified time interval. This is done with the following 2 methods:

startSignificantLocationUpdates()

Which is a low power location updating method, it listens for location updates in the background on both android and iOS (ie it will launch the app and deliver the location updates even if the app was force-killed by the user). The distance filter here is ignored, and location updates are only delivered in +- 500m intervals.

OR we can use the following:

startFrequentLocationUpdates()

Which now tells the OS to deliver location updates to the application more frequently (at your specified distance interval). This consumes more battery of course, and will NOT run in the background on iOS. On android it will run in the background however. I suggest using this for short intervals within your application and only when the app is in the foreground. For background tasks, it is recommended to use the significant updates function for more reliable location updates.

You can call either one of these depending on your use case.

As mentioned, the activity updates are started automatically when a location update comes through, there are no explicit functions (yet) to trigger activity updates manually - the purpose being that this package was developed to allow these updates to occur in the background mostly.

You can listen for the events of location updates and activity updates by subscribing to the following events:

  1. LOCATION_UPDATE: if you would like to receive the location objects when they come through from the OS
  2. ACTIVITY_UPDATE: to receive the activity updates when they are triggered by the location filter being exceeded.

Here's an example of the code implementation to listen to these events:

const emitter = new NativeEventEmitter(
    NativeModules.ActivityRecognitionWrapper
  );

  emitter.addListener('ACTIVITY_UPDATE', (response: any) => {
   //...your handling code here for when a new activity log is sent through
  });
  emitter.addListener('LOCATION_UPDATE', (response: any) => {
      //...your handling code here for when a new location log is sent through

  });

Stopping the service

You can simply stop the service by calling the stop() method that you have imported and this will kill the location and activity listeners.

Contributing

See the contributing guide to learn how to contribute to the repository and the development workflow.

License

MIT


Made with create-react-native-library