Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

react-native-fused-location

MustansirZia459MIT1.1.2TypeScript support: included

A react native module for android which gets the finest location from fused API. Gets location with or without GPS.

react, react-native, location, gps, fused, android, play-services, npm, native

readme

react-native-fused-location

npm version npm Package Quality MIT Licence

Get the finest location on Android using Fused API.

I created this react native module with an inspiration that none of react native's location libraries use the newer Fused API to get location. According to google, it is the most accurate way to get location in an Android device and judges by itself when to use GPS or cell towers/wifi. Thus, it works with both.

Install

npm install react-native-fused-location --save
or
yarn add react-native-fused-location

react-native link react-native-fused-location

• in android/app/build.gradle:

dependencies {
    ...
    compile "com.facebook.react:react-native:+"  // From node_modules
+   compile project(':react-native-fused-location')
}

• in android/settings.gradle:

...
include ':app'
+ include ':react-native-fused-location'
+ project(':react-native-fused-location').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-fused-location/android')

• in MainApplication.java:

+ import com.mustansirzia.fused.FusedLocationPackage;

    @Override
        protected List<ReactPackage> getPackages() {
          return Arrays.<ReactPackage>asList(
              ...
+             new FusedLocationPackage(),
              ...
              new MainReactPackage()
          );
        }

Migration to AndroidX. - BREAKING CHANGE in 1.0.0.

• Version 1.0.0 and above of this libary now makes use of AndroidX namespace instead of the legacy android support library namespace. If your app hasn't migrated to AndroidX yet, consider doing so or instead use an older version of this library such as 0.5.1. React Native 0.59 uses AndroidX.
To enable AndroidX add these two lines in your android/gradle.properties file.

android.useAndroidX=true
android.enableJetifier=true

If this doesn't work out. Check out this official guide from Google.
A guide more specific to React Native would be here.

Permissions.

Add this to your AndroidManifest.xml:

    ...
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    ...
        <permission
            android:name="android.permission.ACCESS_COARSE_LOCATION"
            android:protectionLevel="signature" />
        <permission
                android:name="android.permission.ACCESS_FINE_LOCATION"
                android:protectionLevel="signature"/>
    ...            

Usage.

API.

Function Arguments Returns Note
getFusedLocation forceNewLocation Promise[Location] Call this once to get Location. Pass optional boolean forceNewLocation to get new location update. Otherwise return the last known location. Returns a promise.
startLocationUpdates Nil Promise[Nil] Call this to start receiving location updates. The function returns a promise that will resolve after the bootstrap of the Fused provider is done.
**Note: You still need to subscribe to fusedLocation event.
So, you need to call this before you call FusedLocation.on.
stopLocationUpdates Nil Promise[Boolean] Stop receiving location updates. Call this to stop listening to device's location updates. The function returns a promise that will resolve to a boolean reflecting if the updates were indeed stoped or not (if they were already stopped beforehand).
on eventName, callback Subscription Subscribe to an event. The callback is called with Location updates if the eventName is fusedLocation.
Call this after you call startLocationUpdates
off Subscription Nil Unsubscribe from the corresponding subscription.
areProvidersAvailable Nil Promise[Boolean] Returns a promise that will always resolve to a boolean value. The resolved value reflects the providers' availability; true when location providers are available and false otherwise.

Configuration.

setLocationPriority(priority)

Set location accuracy. priority be of the following types.
FusedLocation.Constants.HIGH_ACCURACY Most accurate. Least battery efficient. Uses GPS only.
FusedLocation.Constants.BALANCED Mixed. Chooses an appropriate provider.
FusedLocation.Constants.LOW_POWER Least accurate. Most battery efficient. Uses Wifi/Cell Towers only.
FusedLocation.Constants.NO_POWER Uses location updates from other apps (if they occur). Don't request location from your app.
• Default FusedLocation.Constants.BALANCED

setLocationInterval(interval)

Set an approximate interval (in milliseconds) between each location updates. Please note that this interval may not be strictly followed. Updates may come faster or slower than the interval argument.
• Default 15000

setFastestLocationInterval(interval)

Set the minimum possible interval between location updates (in milliseconds).
• Default 10000

setSmallestDisplacement(displacement)

Set smallest amount of displacement (in meters) to occur after which the location update will be received.
• Default 0

For more info, see here.

Types.

type Location {
        latitude: Number,
        longitude: Number,
        speed: Number,
        altitude: Number,
        provider: String,
        accuracy: Number,
        bearing: Number,
        mocked: Boolean,
        timestamp: String
}
type Subscription {
        listener: Function,
        eventName: String
}

Example.

...
import FusedLocation from 'react-native-fused-location';
...

async componentDidMount() {
     const granted = await PermissionsAndroid.request(
                    PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION, {
                        title: 'App needs to access your location',
                        message: 'App needs access to your location ' +
                        'so we can let our app be even more awesome.'
                        }
                    );
     if (granted) {

        FusedLocation.setLocationPriority(FusedLocation.Constants.HIGH_ACCURACY);

        // Get location once.
        const location = await FusedLocation.getFusedLocation();
        this.setState({lat: location.latitude, long: location.longitude});

        // Set options.
        FusedLocation.setLocationPriority(FusedLocation.Constants.BALANCED);
        FusedLocation.setLocationInterval(20000);
        FusedLocation.setFastestLocationInterval(15000);
        FusedLocation.setSmallestDisplacement(10);


        // Keep getting updated location.
        FusedLocation.startLocationUpdates();

        // Place listeners.
        this.subscription = FusedLocation.on('fusedLocation', location => {
           /* location = {
             latitude: 14.2323,
             longitude: -2.2323,
             speed: 0,
             altitude: 0,
             provider: 'fused',
             accuracy: 30,
             bearing: 10,
             mocked: false,
             timestamp: '1513190221416'
           }
           */
           console.log(location);
        });

        /* Optional
        this.errSubscription = FusedLocation.on('fusedLocationError', error => {
            console.warn(error);
        });
        */
     }

...

componentWillUnmount() {

    FusedLocation.off(this.subscription);
    // FusedLocation.off(this.errSubscription);
    FusedLocation.stopLocationUpdates();

}  

...

Compatibility.

• For versions < 1.0.0, use with RN versions > 0.40.x < 0.59.x.
• For versions >= 1.0.0, use with RN versions > 0.59.x.

Tested with Android SDK version >= 16 (Android 4.1 - Jelly Bean). Please feel free to test it with other versions.

This repository follows Semantic Versioning. No breaking changes will be incorporated till v2.x.x.

Release Notes.

See CHANGELOG.md.

License.

See License.

Support.

Support my OSS work by buying me a coffee!

Buy Me A Pizza

changelog

Release Notes.

1.1.1

° forceNewLocation argument made optional for getFusedLocation function call.

1.0.0 - BREAKING CHANGE.

° Support library migrated to AndroidX namespace.
° Added support for Typescript. ❤️

0.5.0

° Google play services version can now be overriden and is defaulted to 16.+. ° Android gradle version updated to 3.3.2. • Compile SDK version defaulted to 28. • Build tools version defaulted to 28.0.3.

0.4.0

° BuildToolsVersion and sdkVersion are now taken from the main android project's gradle file.

0.2.0

° LocationCallback added instead of LocationListener to method getFusedLocation() when last location returned null or forceNewLocation was set to true. This would guarantee the promise is resolved or rejected depending upon location availability.

0.1.0

° Made areProvidersAvailable method public under FusedLocation.areProvidersAvailable(). ° Semver for this repo started.

0.0.11

° Add timestamp via getTime() to the location object. Returns the UNIX timestamp (in millis) of when the location was generated.

0.0.8

° Added forceNewLocation as an optional argument to getFusedLocation. This gets a new location everytime and never reuses a last known location.

° Added a check if GPS Provider or Network Provider exists on the device. Useful on emulators where getFusedLocation used to hang when GPS was turned off.

° Added mocked property to the Location object.

• PR for #1 and #3 from - https://github.com/ginosi.

0.0.5

° Fixed typo in ReadMe. Changed setLocationFatestInterval to setFastestLocationInterval in js example.

0.0.4

° Fixed typo in ReadMe. Changed FusedLocation to FusedLocationPackage in manual linking. PR by - https://github.com/jarvisluong

0.0.3

° Default values added to Readme.

0.0.2

° iOS compatibility fixes.

0.0.1

° Initial Commit.