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