Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/mustansirzia/react-native-fused-location

Finest location for react-native on Android using the new Fused API.
https://github.com/mustansirzia/react-native-fused-location

android gps javascript location react react-native

Last synced: 2 days ago
JSON representation

Finest location for react-native on Android using the new Fused API.

Awesome Lists containing this project

README

        

# react-native-fused-location

[![npm version](https://badge.fury.io/js/react-native-fused-location.svg)](https://badge.fury.io/js/react-native-fused-location)
[![npm](https://img.shields.io/npm/dt/react-native-fused-location.svg)](https://www.npmjs.com/package/react-native-fused-location)
[![Package Quality](http://npm.packagequality.com/shield/react-native-fused-location.svg)](http://packagequality.com/#?package=react-native-fused-location)
[![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://opensource.org/licenses/mit-license.php)

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`


#### Automatic Link.
`react-native link react-native-fused-location`
#### Manual Link.
• in `android/app/build.gradle:`

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

• in `android/settings.gradle`:

```diff
...
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:`
```diff
+ import com.mustansirzia.fused.FusedLocationPackage;

@Override
protected List getPackages() {
return Arrays.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.
```properties
android.useAndroidX=true
android.enableJetifier=true
```
If this doesn't work out. Check out [this](https://developer.android.com/jetpack/androidx/migrate) official guide from Google.


A guide more specific to React Native would be [here](https://itnext.io/react-native-how-to-handle-an-app-with-both-pre-androidx-and-androidx-dependencies-rn60-bf4df7ea0dd2).

## Permissions.
Add this to your `AndroidManifest.xml`:

```xml
...


...


...
```

## 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.
```js
...
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](https://semver.org/). 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