{"record":{"id":"cdad10cd1a763584","repo":"microg/GmsCore","slug":"durationmillis-must-be-greater-than-0-cdad10","errorCode":null,"errorMessage":"durationMillis must be greater than 0","messagePattern":"durationMillis must be greater than 0","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"play-services-location/src/main/java/com/google/android/gms/location/LocationRequest.java","lineNumber":407,"sourceCode":"    public boolean isPassive() {\n        return priority == Priority.PRIORITY_PASSIVE;\n    }\n\n    /**\n     * If this request is {@link Priority#PRIORITY_HIGH_ACCURACY}, this will delay delivery of initial low accuracy locations for a\n     * small amount of time in case a high accuracy location can be delivered instead.\n     */\n    public boolean isWaitForAccurateLocation() {\n        return waitForAccurateLocation;\n    }\n\n    /**\n     * @deprecated Use {@link LocationRequest.Builder#setDurationMillis(long)} instead. May be removed in a future release.\n     */\n    @Deprecated\n    @NonNull\n    public LocationRequest setExpirationDuration(long durationMillis) {\n        if (durationMillis <= 0) throw new IllegalArgumentException(\"durationMillis must be greater than 0\");\n        this.durationMillis = durationMillis;\n        return this;\n    }\n\n    /**\n     * @deprecated Use {@link LocationRequest.Builder#setDurationMillis(long)} instead. Using this method will express the expiration time in\n     * terms of duration, which may give unexpected results. May be removed in a future release.\n     */\n    @Deprecated\n    @NonNull\n    public LocationRequest setExpirationTime(long elapsedRealtime) {\n        this.durationMillis = Math.max(1, elapsedRealtime - SystemClock.elapsedRealtime());\n        return this;\n    }\n\n    /**\n     * @deprecated Use {@link LocationRequest.Builder#setMinUpdateIntervalMillis(long)} instead. May be removed in a future release.\n     */","sourceCodeStart":389,"sourceCodeEnd":425,"githubUrl":"https://github.com/microg/GmsCore/blob/157c9d86ac46c195a86c2f15ab55c84036223f95/play-services-location/src/main/java/com/google/android/gms/location/LocationRequest.java#L389-L425","documentation":"LocationRequest.setExpirationDuration() (deprecated) requires a strictly positive lifetime in milliseconds for the request; zero or negative values are meaningless, so IllegalArgumentException is thrown. The deprecated method is called internally by readLocationRequest when converting legacy parcels.","triggerScenarios":"Calling setExpirationDuration(0) or a negative value; also triggered indirectly when a legacy Parcelable LocationRequest carries a non-positive durationMillis.","commonSituations":"Passing a config value defaulting to 0/-1; computing duration via subtraction that underflowed; using the deprecated API on newer play-services versions where LocationRequest.Builder.setDurationMillis is preferred.","solutions":["Pass a positive duration, e.g. setExpirationDuration(TimeUnit.MINUTES.toMillis(10))","Migrate to LocationRequest.Builder.setDurationMillis(long), the non-deprecated replacement","Validate computed durations are > 0 before setting"],"exampleFix":"// before\nrequest.setExpirationDuration(0); // throws\n// after\nrequest.setExpirationDuration(TimeUnit.MINUTES.toMillis(10));\n// or modern equivalent:\nLocationRequest req = new LocationRequest.Builder(priority, intervalMillis)\n    .setDurationMillis(TimeUnit.MINUTES.toMillis(10))\n    .build();","handlingStrategy":"validation","validationCode":"if (durationMillis <= 0) {\n    throw new IllegalStateException(\"Expiration duration must be positive\");\n}\nrequest.setExpirationDuration(durationMillis);","typeGuard":"static boolean isValidDuration(long v) { return v > 0; }","tryCatchPattern":"try { request.setExpirationDuration(d); } catch (IllegalArgumentException e) { request.setExpirationDuration(TimeUnit.MINUTES.toMillis(10)); }","preventionTips":["Validate computed durations (subtraction can underflow) before setting","Prefer LocationRequest.Builder.setDurationMillis() over the deprecated method to avoid legacy conversion paths"],"tags":["location","validation","android","deprecated-api"],"backgroundTag":"invalid-argument-value","analyzedSha":"157c9d86ac46c195a86c2f15ab55c84036223f95","analyzedAt":"2026-09-06T17:27:33.892Z","contentChangedAt":"2026-09-06T17:27:33.892Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}