Skip to content

[Question]: Possibility of using Android AltitudeConverter for WGS84 -> MSL #1742

@zmuranaka

Description

@zmuranaka

Please check the following before submitting a new issue.

Please select for which platform(s) you need help

  • Android
  • iOS
  • Linux
  • macOS
  • Web
  • Windows

Your question

When using Geolocator.getCurrentPosition on Android, we know that even if you have useMSLAltitude set to true from the AndroidSettings, it has no effect, as stated in the Dartdoc here:

/// This property only works with position stream updates and has no effect when getting the
/// current position or last known position.

However, android.location.altitude supports an AltitudeConverter class, which does the following:

Converts altitudes reported above the World Geodetic System 1984 (WGS84) reference ellipsoid into ones above Mean Sea Level.

Is there a way AltitudeConverter could be used by getCurrentPosition to convert locations with WGS84 altitude into MSL? I understand that when getCurrentPosition is called, it calls onGetCurrentPosition, which in turn starts position updates here:

My idea was something like the following (although I am no Java expert, so take with a grain of salt):

geolocationManager.startPositionUpdates(
    locationClient,
    activity,
    (Location location) -> {
      if (replySubmitted[0]) {
        return;
      }

      replySubmitted[0] = true;
      geolocationManager.stopPositionUpdates(locationClient);
      pendingCurrentPositionLocationClients.remove(requestId);
      // Start added code
      boolean useAltitudeConverter = (boolean) map.get("useMSLAltitude");
      if (useAltitudeConverter && Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
        AltitudeConverter altitudeConverter = new AltitudeConverter();
        boolean mslAdded = altitudeConverter.tryAddMslAltitudeToLocation(location);
        if (!mslAdded) {
          new Thread(() -> {
            try {
              altitudeConverter.addMslAltitudeToLocation(context, location);
            } catch (IOException e) {
              Log.e(TAG, "AltitudeConverter IOException: " + e.getMessage());
            }
          }).start();
        }
      }
      // End added code
      result.success(LocationMapper.toHashMap(location));
    },
    (ErrorCodes errorCode) -> {
      if (replySubmitted[0]) {
        return;
      }

      replySubmitted[0] = true;
      geolocationManager.stopPositionUpdates(locationClient);
      pendingCurrentPositionLocationClients.remove(requestId);
      result.error(errorCode.toString(), errorCode.toDescription(), null);
    });

In my brief testing of this it did not work. Is there any chance this could be made to work?

Version

14.0.2

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions