microg/GmsCore · error · IllegalArgumentException
invalid displacement: {smallestDisplacementMeters}
Error message
invalid displacement: {smallestDisplacementMeters} What it means
LocationRequest.setSmallestDisplacement(float) throws IllegalArgumentException when smallestDisplacementMeters is negative. This parameter sets the minimum distance the device must move before a new location is delivered, so negative distances are invalid. The check happens synchronously before the field is assigned.
Source
Thrown at play-services-location/src/main/java/com/google/android/gms/location/LocationRequest.java:491
/**
* @deprecated Use {@link LocationRequest.Builder#setPriority(int)} instead. May be removed in a future release.
*/
@Deprecated
@NonNull
public LocationRequest setPriority(@Priority int priority) {
PriorityUtil.checkValidPriority(priority);
this.priority = priority;
return this;
}
/**
* @deprecated Use {@link LocationRequest.Builder#setMinUpdateDistanceMeters(float)} instead. May be removed in a future release.
*/
@Deprecated
@NonNull
public LocationRequest setSmallestDisplacement(float smallestDisplacementMeters) {
if (smallestDisplacementMeters < 0) throw new IllegalArgumentException("invalid displacement: " + smallestDisplacementMeters);
this.minUpdateDistanceMeters = smallestDisplacementMeters;
return this;
}
/**
* @deprecated Use {@link LocationRequest.Builder#setWaitForAccurateLocation(boolean)} instead. May be removed in a future release.
*/
@Deprecated
@NonNull
public LocationRequest setWaitForAccurateLocation(boolean waitForAccurateLocation) {
this.waitForAccurateLocation = waitForAccurateLocation;
return this;
}
@Override
@NonNull
public String toString() {
StringBuilder sb = new StringBuilder();View on GitHub (pinned to 157c9d86ac)
Solutions
- Clamp before calling: request.setSmallestDisplacement(Math.max(0f, displacementMeters)).
- If a sentinel (-1) means 'no displacement filter', use 0f, which means no minimum-distance filtering.
- Migrate to LocationRequest.Builder.setMinUpdateDistanceMeters(float) with a validated non-negative value.
Example fix
// before request.setSmallestDisplacement(displacementMeters); // throws if negative // after request.setSmallestDisplacement(Math.max(0f, displacementMeters));
Defensive patterns
Strategy: validation
Validate before calling
// Java
public static float sanitizeDisplacement(float displacementMeters) {
return Math.max(0f, displacementMeters);
}
// request.setSmallestDisplacement(sanitizeDisplacement(raw)); Type guard
static boolean isValidDisplacement(float meters) { return meters >= 0f && !Float.isNaN(meters); } Try / catch
// Java
try {
request.setSmallestDisplacement(displacementMeters);
} catch (IllegalArgumentException e) {
Log.w("LocationReq", "Invalid displacement " + displacementMeters + ", using 0", e);
request.setSmallestDisplacement(0f);
} Prevention
- Use 0f (not -1) to mean 'no displacement filter'.
- Sanitize user-entered distances (strip signs, reject NaN) before applying.
- Prefer Builder.setMinUpdateDistanceMeters to avoid deprecated setter surprises.
When it happens
Trigger: Calling the deprecated setSmallestDisplacement() with a negative float, e.g. setSmallestDisplacement(-10f), or a computed displacement that went negative (e.g. subtraction or a sign-flipped config value).
Common situations: Sign errors in conversion (km/h vs m/s style mistakes); -1 sentinel defaults; user-entered displacement with a leading minus parsed as float; unit confusion producing negative deltas.
Understand the failure class
Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.
Related errors
- illegal fastest interval:
- intervalMillis must be greater than or equal to 0
- illegal max wait time:
- invalid numUpdates: {maxUpdates}
- durationMillis must be greater than 0
AI-assisted analysis of microg/GmsCore@157c9d86ac (2026-09-06).
Data as JSON: /api/errors/a99fe39e9badcc66.
Report an issue: GitHub.