当提供者是gps时,返回的位置为空?

时间:2011-04-15 08:53:40

标签: java android

我正在尝试在以下代码段中检索我当前的位置坐标

LocationManager locationManager= (LocationManager) getSystemService(context);

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);

provider = locationManager.getBestProvider(criteria, true);
Location location = locationManager.getLastKnownLocation(provider);

当提供者是“网络”时,我得到位置坐标。

当我更改位置和安全选项中的设置以启用“使用GPS卫星”选项时,提供程序将更改为“ gps ”。 在这种情况下,返回的位置为空。

这可能是什么原因以及如何纠正?

3 个答案:

答案 0 :(得分:4)

GPS提供商需要一段时间才能获得修复,特别是如果没有先前的修复。 getLastKnownLocation不是阻塞调用,它将等待直到建立实际的实时GPS修复(该修复可能需要1分钟,具体取决于各种原因)。

此外,请确保您出于明显的原因而在外面。

您首先需要从中请求位置更新,而不是简单地为GPS提供商调用getLastKnownLocation。

以下文章很好地解释了这个原则:http://developer.android.com/guide/topics/location/obtaining-user-location.html

对于在Android上与位置提供商做任何事情的人来说,这是必读的。

典型的流程是:

  1. 启动申请。
  2. 开始侦听所需位置提供商的更新。
  3. 通过过滤掉新的但不太准确的修补程序来维护位置的“当前最佳估计值”。
  4. 停止侦听位置更新。
  5. 利用最后一次最佳位置估算。
  6. 查看下面的代码,我们正在初始化MyLocationListener(跟踪手机的位置),并检索对LocationManager的引用。我们要求位置管理员更新位置信息。我们使用10米的minDistance(通知的最小距离间隔)和35秒的minTime(通知的最小时间间隔)。

    LocationListener locationListener = new MyLocationListener();
    LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 35000, 10, this.locationListener);
    

    实现此功能时,您可能会注意到MyLocationListener接收到的预期更多更新(给定minTime和minDistance参数)。以下文章http://blog.doityourselfandroid.com/2010/12/25/understanding-locationlistener-android/可以帮助您理解原因。

答案 1 :(得分:2)

移动设备连接某些卫星需要几秒钟的时间。只要手机没有连接,因为尚未建立连接,该位置将为空。

您还必须从GPS提供商处请求位置更新。

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

答案 2 :(得分:2)

我认为问题是GPS需要几秒钟才能同步。你必须使用一个线程。举个例子:

@Override
public void run() {

    mLocationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);

    if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
        Looper.prepare();
        mToast.Make(getContext(),"GPS",0);
        mLocationListener = new MyLocationListener();
        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);
        Looper.loop(); 
        Looper.myLooper().quit(); 

    } else if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
        Looper.prepare();
        mToast.Make(getContext(),"Triangulacion",0);
        mLocationListener = new MyLocationListener();
        mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mLocationListener);
        Looper.loop();
        Looper.myLooper().quit();
    }else{
        mToast.Make(context,"No se encuentra señal se procede a mandar un mensaje normal",0);
        Looper.prepare();
        handlerNormal.sendEmptyMessage(0);
        Looper.loop();
        Looper.myLooper().quit();
    }   

}

和位置监听器

private class MyLocationListener implements LocationListener 
{
    @Override
    public void onLocationChanged(Location loc) {
        if (loc != null) {
            setCurrentLocation(loc);
            handler.sendEmptyMessage(0);
        }
    }  

// ...
}