我想知道用户的位置,但如果 gps 尚未打开,则无需打开它,这意味着我只想获取用户正在使用地图或类似工具的位置。
如果我做
locationManager.requestLocationUpdates();
打开gps。
如果我使用
locationManager.getLastKnownLocation();
这总是返回相同的位置,即使应该有新的位置,因为地图正在运行。
任何人的想法?:)
我想知道用户的位置,但如果 gps 尚未打开,则无需打开它,这意味着我只想获取用户正在使用地图或类似工具的位置。
如果我做
locationManager.requestLocationUpdates();
打开gps。
如果我使用
locationManager.getLastKnownLocation();
这总是返回相同的位置,即使应该有新的位置,因为地图正在运行。
任何人的想法?:)
您可以使用PASSIVE_PROVIDER
,但这仅在 API 级别 8 中引入。
来自 LocationManager 的 Android 文档
一种特殊的位置提供程序,用于在不实际启动位置修复的情况下接收位置。当其他应用程序或服务请求位置更新时,此提供程序可用于被动接收位置更新,而无需自己实际请求位置。该提供者将返回由其他提供者生成的位置。您可以查询 getProvider() 方法来确定位置更新的来源。需要权限 android.permission.ACCESS_FINE_LOCATION,但如果未启用 GPS,此提供程序可能只会返回粗略的修复。
这样,您就不会直接请求任何位置更新,您只会在其他应用程序请求更新时获取它们。
至于getLastKnownLocation()
再次引用 Android 文档:
返回一个 Location 指示从给定提供程序获得的最后一个已知位置修复的数据。这可以在不启动提供程序的情况下完成。请注意,此位置可能已过时,例如,如果设备已关闭并移动到另一个位置。如果提供程序当前被禁用,则返回 null。
因此,如果您一遍又一遍地获得相同的位置,getLastKnownLocation
则可能是该提供程序被禁用,而您只是获得了函数名称所指示的内容,即设备的最后一个已知位置。阅读上面的引用或参考 Android 文档了解更多详细信息。
尝试这个:
有你的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
使用requestLocationUpdates
WiFi 和蜂窝定位,并以编程方式打开 wifi 以提高准确性。定期检查是否isGpsStarted
为真,然后切换到GPS_PROVIDER
with requestSingleUpdate
。还要检查是否需要切换回NETWORK_PROVIDER
并定期更新,如果isGpsStarted
再次变为 false。