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

  1. Clamp before calling: request.setSmallestDisplacement(Math.max(0f, displacementMeters)).
  2. If a sentinel (-1) means 'no displacement filter', use 0f, which means no minimum-distance filtering.
  3. 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

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


AI-assisted analysis of microg/GmsCore@157c9d86ac (2026-09-06). Data as JSON: /api/errors/a99fe39e9badcc66. Report an issue: GitHub.