1

我想知道用户的位置,但如果 gps 尚未打开,则无需打开它,这意味着我只想获取用户正在使用地图或类似工具的位置。

如果我做

locationManager.requestLocationUpdates();

打开gps。

如果我使用

locationManager.getLastKnownLocation();

这总是返回相同的位置,即使应该有新的位置,因为地图正在运行。

任何人的想法?:)

4

2 回答 2

0

您可以使用PASSIVE_PROVIDER,但这仅在 API 级别 8 中引入。 来自 LocationManager 的 Android 文档

一种特殊的位置提供程序,用于在不实际启动位置修复的情况下接收位置。当其他应用程序或服务请求位置更新时,此提供程序可用于被动接收位置更新,而无需自己实际请求位置。该提供者将返回由其他提供者生成的位置。您可以查询 getProvider() 方法来确定位置更新的来源。需要权限 android.permission.ACCESS_FINE_LOCATION,但如果未启用 GPS,此提供程序可能只会返回粗略的修复。

这样,您就不会直接请求任何位置更新,您只会在其他应用程序请求更新时获取它们。

至于getLastKnownLocation()再次引用 Android 文档:

返回一个 Location 指示从给定提供程序获得的最后一个已知位置修复的数据。这可以在不启动提供程序的情况下完成。请注意,此位置可能已过时,例如,如果设备已关闭并移动到另一个位置。如果提供程序当前被禁用,则返回 null。

因此,如果您一遍又一遍地获得相同的位置,getLastKnownLocation则可能是该提供程序被禁用,而您只是获得了函数名称所指示的内容,即设备的最后一个已知位置。阅读上面的引用或参考 Android 文档了解更多详细信息。

于 2012-06-22T15:47:59.317 回答
0

尝试这个:

有你的Activity工具GpsStatus.Listener和使用

boolean isGpsStarted= false;
public void onGpsStatusChanged(int event) {
    switch (event) {
        case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
            break;
        case GpsStatus.GPS_EVENT_FIRST_FIX:                               
            break;
        case GpsStatus.GPS_EVENT_STARTED:
            isGpsStarted = true;
            break;
        case GpsStatus.GPS_EVENT_STOPPED:
            isGpsStarted = false;
            break;
    }
}

使用which 将NETWORK_PROVIDER使用requestLocationUpdatesWiFi 和蜂窝定位,并以编程方式打开 wifi 以提高准确性。定期检查是否isGpsStarted为真,然后切换到GPS_PROVIDERwith requestSingleUpdate。还要检查是否需要切换回NETWORK_PROVIDER并定期更新,如果isGpsStarted再次变为 false。

于 2012-06-22T16:24:08.607 回答