2013-10-16 115 views
3

我有一个简单的类GPSListener其获取GPS坐标:的Android位置服务不更新requestLocationUpdates

public class GPSListener implements LocationListener { 

public static double latitude; 
public static double longitude; 

@Override 
public void onLocationChanged(Location loc) 
{ 
    loc.getLatitude(); 
    loc.getLongitude(); 
    latitude = loc.getLatitude(); 
    longitude = loc.getLongitude(); 
    Log.d("GPSLISTENER ", "lat: "+latitude+" long:"+longitude); 
} ... 

然后试图利用这个类在我的活动,我简单地调用这个类在我onCreate()功能我的活动:

LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    LocationListener mlocListener = new GPSListener(); 

    Criteria criteria = new Criteria(); 
    String bestProvider = mlocManager.getBestProvider(criteria, false); 
    mlocManager.requestLocationUpdates(bestProvider, 0, 0, mlocListener); 

    mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener); 

    if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
      lat = GPSListener.latitude; 
      lon = GPSListener.longitude; 
      Log.d("GPS", "lat: "+lat+" long:"+lon); 
    } else { 
      // TODO: GPS not enabled 
      Log.d("GPSERROR", "GPS not enabled"); 
    } 

但每当我运行应用程序,在我的活动latlon始终为零。我不太清楚如何解决这个问题。

当日志:

Log.d("GPSLISTENER ", "lat: "+latitude+" long:"+longitude); 

它返回正确的纬度和经度,它只是需要一两秒钟的活动开始后。

Log.d("GPSSUCCESS", "lat: "+lat+" long:"+lon); 

仅返回0.0。在if语句执行之前,我的印象是.requestLocationUpdates会将值传递给latlon。我怎样才能做到这一点?

+0

你添加的权限(android.permission.ACCESS_FINE_LOCATION)在清单文件中的位置? – prijupaul

+0

@prijupaul是的。 –

+0

如果您正在仿真器上进行测试,您需要将坐标传递给它,或者如果您在设备上,请重新启动设备并检查。 – Shrikant

回答

2

您正在使用公共静态字段的纬度,经度。

请其即时改变对象非静态和使用二传手,吸气:

lat = mlocListener.getLatitude(); 
lon = mlocListener.getLongitude(); 
+0

没有运气。仍是同样的问题。 –

+0

您可以替换: mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,mlocListener);通过: 位置loc = mlocManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); –

+0

也许我有点困惑。你介意在代码中再详细一点吗? –

0

的LocationManager从缓存使用最后一个已知位置。加载谷歌地图时,缓存会更新。试试看,在外面打开并检查你的位置。移动到大约200米的不同位置,然后再次检查您的位置。它会和旧的一样。现在,加载谷歌地图,你会发现你的应用程序神奇地现在有了新的位置。

您需要以编程方式将该缓存踢到最新位置。要做到这一点的唯一方法是

YOUR_APPLICATION_CONTEXT.getLocationManager().requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() { 
    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 
    @Override 
    public void onProviderEnabled(String provider) { 
    } 
    @Override 
    public void onProviderDisabled(String provider) { 
    } 
    @Override 
    public void onLocationChanged(final Location location) { 
    } 
}); 
1

谷歌更新了其位置的处理逻辑。使用融合位置提供程序监听位置更新现在更容易。你可以在5分钟内实现你的位置监听器。看一看。 Methods for getting the most accurate location

您正在监听仅gps提供程序,它尚未准备好(在等待位置状态),然后它不返回任何位置。只要看看融合的位置提供商,然后再写下你的位置监听器。

1

试试这个...

mGoogleMap.setOnMyLocationButtonClickListener(new OnMyLocationButtonClickListener() { 

      @Override 
      public boolean onMyLocationButtonClick() 
       { 
        try 
         { 
          Location myLocation = mGoogleMap.getMyLocation(); 
          onLocationChanged(myLocation); 

         } 
        catch (Exception e) 
         { 
          Log.getStackTraceString(e); 
         } 

        return false; 
       } 
     }); 

用户这个处理程序来获取位置

private Handler customHandler = new Handler(); 


    private Runnable updateTimerThread = new Runnable() { 

    @Override 
    public void run() 
     { 
      try 
       { 

        Location myLocation = mGoogleMap.getMyLocation(); 
        secndLocationListener.onLocationChanged(myLocation); 
       } 
      catch (Exception e) 
       { 
        Log.getStackTraceString(e); 
       } 

     } 
}; 

运行此

customHandler.postDelayed(updateTimerThread , 1000);