Android位置服务未更新requestLocationUpdates

时间:2013-10-16 03:38:48

标签: android gps location

我有一个简单的班级GPSListener,可以获得GPS坐标:

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。我的印象是.requestLocationUpdates会在执行if语句之前将值传递给latlon。我怎么能做到这一点?

4 个答案:

答案 0 :(得分:2)

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

请将其更改为非静态并使用setter,getter with instant object:

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

答案 1 :(得分:1)

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

您正在侦听gps提供程序,但尚未准备好(在等待位置状态时),然后它不会返回任何位置。只需看看融合位置提供程序并再次编写您的位置监听器。

答案 2 :(得分: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);

答案 3 :(得分: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) {
    }
});