如果我们想要在Android中获得单个GPS修复,我们实际上使用已知函数requestSingleUpdate()和LocationManager.GPS_PROVIDER,对吧?
现在我正在我的函数getLocation()中打开GPS,但设备不会自动建立连接,除非我手动关闭GPS然后再打开它。 requestSingleUpdate()为网络提供商提供完美的工作,我只是不知道为什么这不适合GPS修复。
以下是我的源代码中的一部分:
getLocation()由另一个带有计时器的对象每隔2分钟运行..在getLocation()中,如果GPS和网络打开,它会尝试在第一分钟获得GPS修复,然后它将获取网络位置没有可用的GPS定位。
public boolean getLocation() {
// DEBUG
Log.d("GPS Connection", "Entering getLocation()");
gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if(!gpsEnabled && !networkEnabled)
return false;
if(gpsEnabled && networkEnabled) {
// DEBUG
Log.d("GPS Connection", "Request GPS Data");
locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, gpsLocationListener, Looper.getMainLooper());
gpsGetLocationTimeout = new Timer();
gpsGetLocationTimeout.schedule(new GetNetworkLocation(), GPS_MAX_CONNECTION_TIME_MS);
}
...
答案 0 :(得分:6)
收到最近的位置可能需要一段时间。如果 需要立即定位,申请可以使用 getLastKnownLocation(String)方法。如果提供者被禁用 由用户,将不会收到更新,并且 将调用onProviderDisabled(String)方法。一旦到了 提供程序再次启用,onProviderEnabled(String)方法将 被呼叫,位置更新将重新开始。
GPS可能需要很长时间才能从冷启动中获得。如果你在室内,在停车场,高楼大厦周围,有一个蹩脚的电话,或者如果GPS卫星神在一个有趣的心情,你可能永远不会得到GPS。
在某些应用程序中,我们会执行类似于请求GPS位置的操作,然后如果它在60秒后没有到达,则取消请求,以便我们不会在半永久性地使用GPS RX时杀死手机的电池。
您可以请求上一个已知位置并检查其年龄并确定它是否足够使用。网络位置快速且便宜(就电池使用而言),一个好的策略是使用网络位置,直到你获得GPS。
我在Android中编码GPS的经验是,GPS将会做它想做的事情,这在许多方面都不是文档所能带来的预期。 GPS需要被视为可能有或没有可用的东西,并且可以设计程序的逻辑来处理它。