Skip to content

[Bug]: Crashes on launch — setPriority(-1) when desiredAccuracy is HIGH #1677

@lucasbstn

Description

@lucasbstn

Required Reading

  • Confirmed

Plugin Version

5.1.2

Flutter Doctor

$ flutter doctor -v

[✓] Flutter (Channel stable, 3.41.7, on macOS 26.3.1 25D2128 darwin-arm64, locale en-US)
    • Flutter version 3.41.7 on channel stable
    • Framework revision cc0734ac71 (3 weeks ago), 2026-04-15
    • Engine revision 59aa584fdf
    • Dart version 3.11.5
    • DevTools version 2.54.2

[✓] Android toolchain - develop for Android devices (Android SDK version 36.0.0)
    • Android SDK at /Users/lucas/Library/Android/sdk
    • Platform android-36, build-tools 36.0.0
    • Java version OpenJDK Runtime Environment (build 21.0.6+-13391695-b895.109)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 26.4.1)
    • Build 17E202
    • CocoaPods version 1.16.2

[✓] Connected device (5 available)
    • Pixel 9 (mobile)  • android-arm64  • Android 16 (API 36)

[✓] Network resources

• No issues found!

Mobile operating-system(s)

  • iOS
  • Android

Device Manufacturer(s) and Model(s)

Google Pixel 9

Device operating-systems(s)

Android 16

What happened?

With no source change, the Android app started crashing on launch — Gradle resolved the freshly published tslocationmanager 4.1.5 (the plugin declares the floating range 4.1.+).

TSLocationManager.buildLocationRequest() ends up calling LocationRequest.setPriority(-1), and play-services-location 21.x rejects it:

java.lang.IllegalArgumentException: priority -1 must be a Priority.PRIORITY_* constant

The -1 is the Dart-side DESIRED_ACCURACY_HIGH constant. In 4.1.3, GeoState.androidDesiredAccuracy() always ran it through AccuracyTranslator.toAndroid (-1 → 100). In 4.1.5, that translation is gated on a new useCLLocationAccuracy flag that is false by default, so the raw -1 reaches setPriority.

Expected: desiredAccuracy: DesiredAccuracy.high should map to Priority.PRIORITY_HIGH_ACCURACY (100), as in 4.1.3.

Workaround: pinning tslocationmanagerVersion = "4.1.3" in android/build.gradle.kts restores the pre-regression behavior.

Plugin Code and/or Config

bg.GeoConfig _buildGeoConfig() {
  if (defaultTargetPlatform == TargetPlatform.android) {
    return bg.GeoConfig(
      desiredAccuracy: bg.DesiredAccuracy.high, // = Config.DESIRED_ACCURACY_HIGH = -1
      disableLocationAuthorizationAlert: true,
      showsBackgroundLocationIndicator: false,
      locationAuthorizationRequest: 'Any',
      distanceFilter: 50,
    );
  }
  return bg.GeoConfig(
    desiredAccuracy: bg.DesiredAccuracy.high,
    disableLocationAuthorizationAlert: true,
    showsBackgroundLocationIndicator: false,
    locationAuthorizationRequest: 'Any',
    distanceFilter: 50,
  );
}

bg.AppConfig _buildAppConfig() {
  if (defaultTargetPlatform == TargetPlatform.android) {
    return bg.AppConfig(
      enableHeadless: true,
      stopOnTerminate: false,
      startOnBoot: true,
      notification: bg.Notification(
        title: 'JobSnap',
        text: 'Running in the background to keep your time accurate',
        smallIcon: 'drawable/notif_icon',
        largeIcon: 'drawable/notif_icon',
      ),
      backgroundPermissionRationale: bg.PermissionRationale(
        title: 'Enable Auto Clock In/Out with GPS.',
        message: 'To reliably clock you in and out, please enable '
            '{backgroundPermissionOptionLabel} location permission',
        positiveAction: 'Change to {backgroundPermissionOptionLabel}',
        negativeAction: 'Cancel',
      ),
    );
  }
  return bg.AppConfig(stopOnTerminate: false, startOnBoot: true);
}

await bg.BackgroundGeolocation.ready(
  bg.Config(
    reset: true,
    foregroundService: true,
    extras: {'user_id': userId},
    geolocation: _buildGeoConfig(),
    app: _buildAppConfig(),
    logger: bg.LoggerConfig(
      debug: kDebugMode,
      logLevel: bg.LogLevel.debug,
      logMaxDays: 7,
    ),
  ),
);

Relevant log output

Cold-launch crash via `FgsLaunchGate.handleColdLaunch` — clearest single trace:


05-07 22:13:15.740 19130 19130 E AndroidRuntime: FATAL EXCEPTION: main
05-07 22:13:15.740 19130 19130 E AndroidRuntime: Process: app.swx.jobsnap, PID: 19130
05-07 22:13:15.740 19130 19130 E AndroidRuntime: java.lang.RuntimeException: Unable to start receiver com.transistorsoft.locationmanager.service.FgsLaunchGate
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at android.app.ActivityThread.handleReceiver(ActivityThread.java:5335)
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2741)
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at android.os.Looper.loop(Looper.java:367)
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:9333)
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:566)
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:929)
05-07 22:13:15.740 19130 19130 E AndroidRuntime: Caused by: java.lang.IllegalArgumentException: priority -1 must be a Priority.PRIORITY_* constant
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at com.google.android.gms.common.internal.K.b(SourceFile:10)
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at h4.F.b(SourceFile:31)
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at com.transistorsoft.locationmanager.location.TSLocationManager.buildLocationRequest(SourceFile:83)
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at com.transistorsoft.locationmanager.location.TSLocationManager.requestLocationUpdates(SourceFile:53)
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at com.transistorsoft.locationmanager.service.TrackingService.e(SourceFile:24)
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at com.transistorsoft.locationmanager.adapter.BackgroundGeolocation.d(SourceFile:20)
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at com.transistorsoft.locationmanager.adapter.BackgroundGeolocation.b(SourceFile:4)
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at com.transistorsoft.locationmanager.adapter.BackgroundGeolocation.getInstance(SourceFile:3)
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at com.transistorsoft.locationmanager.service.FgsLaunchGate.handleColdLaunch(SourceFile:24)
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at com.transistorsoft.locationmanager.service.FgsLaunchGate.onReceive(SourceFile:73)
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     at android.app.ActivityThread.handleReceiver(ActivityThread.java:5328)
05-07 22:13:15.740 19130 19130 E AndroidRuntime:     ... 10 more


Same `IllegalArgumentException` also fires from the foreground/background callback paths:


05-07 22:13:17.432 19197 19197 E AndroidRuntime: FATAL EXCEPTION: main
05-07 22:13:17.432 19197 19197 E AndroidRuntime: Process: app.swx.jobsnap, PID: 19197
05-07 22:13:17.432 19197 19197 E AndroidRuntime: java.lang.IllegalArgumentException: priority -1 must be a Priority.PRIORITY_* constant
05-07 22:13:17.432 19197 19197 E AndroidRuntime:     at com.google.android.gms.common.internal.K.b(SourceFile:10)
05-07 22:13:17.432 19197 19197 E AndroidRuntime:     at h4.F.b(SourceFile:31)
05-07 22:13:17.432 19197 19197 E AndroidRuntime:     at com.transistorsoft.locationmanager.location.TSLocationManager.buildLocationRequest(SourceFile:83)
05-07 22:13:17.432 19197 19197 E AndroidRuntime:     at com.transistorsoft.locationmanager.location.TSLocationManager.requestLocationUpdates(SourceFile:53)
05-07 22:13:17.432 19197 19197 E AndroidRuntime:     at com.transistorsoft.locationmanager.location.TSLocationManager.onSingleLocationResult(SourceFile:433)
05-07 22:13:17.432 19197 19197 E AndroidRuntime:     at com.transistorsoft.locationmanager.location.TSLocationManager$1.onLocation(SourceFile:22)
05-07 22:13:17.432 19197 19197 E AndroidRuntime:     at com.transistorsoft.locationmanager.location.TSLocationManager.a(SourceFile:16)
05-07 22:13:17.432 19197 19197 E AndroidRuntime:     at com.transistorsoft.locationmanager.location.g.onSuccess(SourceFile:1)
05-07 22:13:17.432 19197 19197 E AndroidRuntime:     at com.google.android.gms.tasks.zzm.run(SourceFile:24)
05-07 22:13:17.432 19197 19197 E AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:1095)
05-07 22:13:17.432 19197 19197 E AndroidRuntime:     at android.os.Looper.loop(Looper.java:367)
05-07 22:13:17.432 19197 19197 E AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:9333)


Crash repeats until Android's `ActivityManager` flags the app as "crashed too many times, killing":


05-08 09:26:46.787  1875  2575 W ActivityManager: Process app.swx.jobsnap has crashed too many times, killing! Reason: crashed quickly
05-08 09:26:46.798  1875  2575 I ActivityManager: Killing 25128:app.swx.jobsnap/u0a650 (adj 200): crash
05-08 09:26:46.806  1875  2575 W ActivityManager: Scheduling restart of crashed service app.swx.jobsnap/com.transistorsoft.locationmanager.service.TrackingService in 3600000ms for start-requested

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions