【问题标题】:Getting current Location now, not on update现在获取当前位置,而不是更新
【发布时间】:2016-05-05 16:47:24
【问题描述】:

我正在构建一个应用程序,它需要您当前的位置来初始化和显示地图。我正在使用LocationManager.requestLocationUpdates(...) 请求位置更新,但这似乎只会在位置发生变化时给我数据(例如,我移动了 10 英尺)。我也在尝试使用 getLastKnownLocation,但在一些不常见的情况下(例如打开 GPS 并且不移动打开应用程序)这将为我正在使用的所有提供者返回 null。

只要 getLastKnownLocation 返回 null,我的应用程序就无法初始化,直到我移动 10 英尺并接收到位置更新。到目前为止,我还没有找到一种方法来轮询我的位置,也没有发现任何暗示当我requestLocationUpdates(...) 我可以在我订阅的那一刻而不是在我等待指定的时间段或移动指定的距离。

一种方法是在非常小的时间间隔或 0 时间间隔内发送到 requestLocationUpdates(...),将其发送给我当前位置,删除 LocationListener 并再次删除 requestLocationUpdates(...),但这次我使用更大的值来避免流失电池。

我正在寻找更好的方法来解决这个问题。可能是 getCurrentLocation() 之类的东西,但实际上任何东西都有效。

【问题讨论】:

  • 要获得准确的读数,任何解决方案都将涉及等待位置。如果 gps 提供商无法获取位置,您将获得空值。 FusedLocation API 有一些东西,你可以设置你想要的更新数量,这样你就可以得到一个,如果这就是你所需要的,但你仍然需要等待developers.google.com/android/reference/com/google/android/gms/…
  • “可能类似于 getCurrentLocation()”——不存在,因为不能保证您能够获得位置。除了用户在 Android 6.0+ 上禁用提供程序或阻止权限的标准问题外,设备可能由于环境因素而无法获取位置。例如,该设备可以在地下停车库中。是否存在具有某种超时值的getCurrentLocation()?是的,但这对您自己实施并不是特别困难。

标签: android gps android-gps


【解决方案1】:

我正在请求位置更新 LocationManager.requestLocationUpdates(...),但这似乎只是 当位置改变时给我数据(例如我移动了 10 英尺)。

一旦确定位置,它就会为您提供第一次位置更新——无论您是否正在移动。一段时间内继续收听更多更新并不是一个坏主意,因为第一个更新可能不太准确。

我正在寻找更好的方法来解决这个问题。大概是这样的 getCurrentLocation(),但实际上任何可行的方法。

如果您不想接收持续更新,那么LocationManager.requestSingleUpdate() 变体之一呢?

这些只会在onLocationChanged() 回调(或通过Intent)中为您提供一个位置更新,仅此而已。无需取消任何侦听器等。调用可能类似于:

locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, this, Looper.getMainLooper());

【讨论】:

  • 显然我错过了 requestLocationUpdates 在确定位置后立即给我更新的事实。据我了解(并对其进行了测试,尽管我没有测试很远)我必须实际移动最小距离或等待指定的时间间隔才能获得第一次更新。非常感谢这些澄清。
【解决方案2】:

我认为你只使用 onLocationChanged 方法来完成你的工作。

这样做。

@Override
public void onConnected(@Nullable Bundle bundle) {
  updateUi();   
  }` 

public void updateUi() {
        try {
            mlastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
            if (mlastLocation != null) {
                final double latitude = mlastLocation.getLatitude();
                final double longitude = mlastLocation.getLongitude();

               //using this cordinates you can initialize map

                }
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    }`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2017-08-20
    • 2022-01-16
    • 1970-01-01
    • 2016-08-16
    相关资源
    最近更新 更多