diff --git a/README.md b/README.md
index f1b9104..a16c25b 100644
--- a/README.md
+++ b/README.md
@@ -116,12 +116,15 @@ You can call `configure` multiple times at it will only change the setting which
```javascript
RNLocation.configure({
- distanceFilter: 0,
+ distanceFilter: 100, // Meters
+ desiredAccuracy: {
+ ios: "best",
+ android: "balancedPowerAccuracy"
+ },
// iOS Only
activityType: "other",
allowsBackgroundLocationUpdates: false,
- desiredAccuracy: "best",
- headingFilter: 1,
+ headingFilter: 1, // Degrees
headingOrientation: "portrait",
pausesLocationUpdatesAutomatically: false,
showsBackgroundLocationIndicator: false,
diff --git a/android/src/main/java/com/github/reactnativecommunity/location/RNFusedLocationProvider.java b/android/src/main/java/com/github/reactnativecommunity/location/RNFusedLocationProvider.java
index bfd0fd8..a421b09 100644
--- a/android/src/main/java/com/github/reactnativecommunity/location/RNFusedLocationProvider.java
+++ b/android/src/main/java/com/github/reactnativecommunity/location/RNFusedLocationProvider.java
@@ -70,6 +70,37 @@ public void configure(final Activity activity, final ReadableMap options, final
}
}
+ // Priority
+ if (options.hasKey("desiredAccuracy")) {
+ if (options.getType("desiredAccuracy") == ReadableType.Map) {
+ ReadableMap desiredAccuracy = options.getMap("desiredAccuracy");
+ if (desiredAccuracy.hasKey("android")) {
+ if (desiredAccuracy.getType("android") == ReadableType.String) {
+ String desiredAccuracyAndroid = desiredAccuracy.getString("android");
+ if (desiredAccuracyAndroid.equals("balancedPowerAccuracy")) {
+ locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
+ hasChanges = true;
+ } else if (desiredAccuracyAndroid.equals("highAccuracy")) {
+ locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
+ hasChanges = true;
+ } else if (desiredAccuracyAndroid.equals("lowPower")) {
+ locationRequest.setPriority(LocationRequest.PRIORITY_LOW_POWER);
+ hasChanges = true;
+ } else if (desiredAccuracyAndroid.equals("noPower")) {
+ locationRequest.setPriority(LocationRequest.PRIORITY_NO_POWER);
+ hasChanges = true;
+ } else {
+ Utils.emitWarning(context, "desiredAccuracy.android was passed an unknown value: " + desiredAccuracyAndroid, "401");
+ }
+ } else {
+ Utils.emitWarning(context, "desiredAccuracy.android must be a string", "401");
+ }
+ }
+ } else {
+ Utils.emitWarning(context, "desiredAccuracy must be an object", "401");
+ }
+ }
+
// Return early if no changes were made
if (!hasChanges) {
promise.resolve(null);
diff --git a/example/App.js b/example/App.js
index 1c6c591..c4bcc6b 100644
--- a/example/App.js
+++ b/example/App.js
@@ -46,8 +46,8 @@ export default class App extends React.PureComponent {
_startUpdatingLocation = () => {
this.locationSubscription = RNLocation.subscribeToLocationUpdates(
- location => {
- this.setState({ location });
+ locations => {
+ this.setState({ location: locations[0] });
}
);
};
@@ -101,21 +101,21 @@ export default class App extends React.PureComponent {
Course
- {location.coords.course}
+ {location.course}
Speed
- {location.coords.speed}
+ {location.speed}
Altitude
- {location.coords.altitude}
+ {location.altitude}
@@ -124,31 +124,25 @@ export default class App extends React.PureComponent {
Latitude
-
- {location.coords.latitude}
-
+ {location.latitude}
Longitude
-
- {location.coords.longitude}
-
+ {location.longitude}
Accuracy
-
- {location.coords.accuracy}
-
+ {location.accuracy}
Altitude Accuracy
- {location.coords.altitudeAccuracy}
+ {location.altitudeAccuracy}
diff --git a/ios/RNLocation.m b/ios/RNLocation.m
index d27b88a..84432da 100644
--- a/ios/RNLocation.m
+++ b/ios/RNLocation.m
@@ -141,17 +141,20 @@ - (void)stopObserving
}
// Desired accuracy
- NSString *desiredAccuracy = [RCTConvert NSString:options[@"desiredAccuracy"]];
- if ([desiredAccuracy isEqualToString:@"bestForNavigation"]) {
- self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
- } else if ([desiredAccuracy isEqualToString:@"best"]) {
- self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
- } else if ([desiredAccuracy isEqualToString:@"nearestTenMeters"]) {
- self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
- } else if ([desiredAccuracy isEqualToString:@"hundredMeters"]) {
- self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
- } else if ([desiredAccuracy isEqualToString:@"threeKilometers"]) {
- self.locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
+ NSDictionary *desiredAccuracy = [RCTConvert NSDictionary:options[@"desiredAccuracy"]];
+ if (desiredAccuracy != nil) {
+ NSString *desiredAccuracyIOS = [RCTConvert NSString:desiredAccuracy[@"ios"]];
+ if ([desiredAccuracyIOS isEqualToString:@"bestForNavigation"]) {
+ self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
+ } else if ([desiredAccuracyIOS isEqualToString:@"best"]) {
+ self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
+ } else if ([desiredAccuracyIOS isEqualToString:@"nearestTenMeters"]) {
+ self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
+ } else if ([desiredAccuracyIOS isEqualToString:@"hundredMeters"]) {
+ self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
+ } else if ([desiredAccuracyIOS isEqualToString:@"threeKilometers"]) {
+ self.locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
+ }
}
// Distance filter
@@ -171,11 +174,11 @@ - (void)stopObserving
NSString *headingOrientation = [RCTConvert NSString:options[@"headingOrientation"]];
if ([headingOrientation isEqualToString:@"portrait"]) {
self.locationManager.headingOrientation = CLDeviceOrientationPortrait;
- } else if ([desiredAccuracy isEqualToString:@"portraitUpsideDown"]) {
+ } else if ([headingOrientation isEqualToString:@"portraitUpsideDown"]) {
self.locationManager.headingOrientation = CLDeviceOrientationPortraitUpsideDown;
- } else if ([desiredAccuracy isEqualToString:@"landscapeLeft"]) {
+ } else if ([headingOrientation isEqualToString:@"landscapeLeft"]) {
self.locationManager.headingOrientation = CLDeviceOrientationLandscapeLeft;
- } else if ([desiredAccuracy isEqualToString:@"landscapeRight"]) {
+ } else if ([headingOrientation isEqualToString:@"landscapeRight"]) {
self.locationManager.headingOrientation = CLDeviceOrientationLandscapeRight;
}
diff --git a/src/types.ts b/src/types.ts
index 99b76e7..a738ed1 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -16,11 +16,21 @@ export type LocationActivityType =
| "otherNavigation"
| "airborne"; // iOS 12+
/**
- * The accuracy of a geographical coordinate.
+ * The accuracy of the location responses for Android.
* @platform ios
* @see [Apple Docs](https://developer.apple.com/documentation/corelocation/cllocationaccuracy?language=objc)
*/
-export type LocationAccuracy =
+export type LocationPriorityAndroid =
+ | "balancedPowerAccuracy"
+ | "highAccuracy"
+ | "lowPower"
+ | "noPower";
+/**
+ * The accuracy of a geographical coordinate for iOS.
+ * @platform ios
+ * @see [Apple Docs](https://developer.apple.com/documentation/corelocation/cllocationaccuracy?language=objc)
+ */
+export type LocationAccuracyIOS =
| "bestForNavigation"
| "best"
| "nearestTenMeters"
@@ -132,11 +142,15 @@ export interface ConfigureOptions {
*/
allowsBackgroundLocationUpdates?: boolean | void;
/**
- * The accuracy of the location data. Defaults to `best`.
- * @platform ios
+ * The accuracy of the location data. Defaults to `best` on iOS and `balancedPowerAccuracy` on Android.
+ * @platform android ios
* @see [Apple Docs](https://developer.apple.com/documentation/corelocation/cllocationmanager/1423836-desiredaccuracy)
+ * @see [Android Docs](https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#setPriority(int))
*/
- desiredAccuracy?: LocationAccuracy | void;
+ desiredAccuracy?: {
+ ios?: LocationAccuracyIOS | void;
+ android?: LocationPriorityAndroid | void;
+ } | void;
/**
* The minimum angle in degrees that the device heading needs to change before the heading update callback in your app is called. Defaults to `0` for no filtering.
* @platform ios