4

我有一个简单的类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 语句执行之前lat和之前。lon我怎样才能做到这一点?

4

4 回答 4

3

您正在使用公共静态字段作为纬度、经度。

请将其更改为非静态并使用 setter、getter 和即时对象:

lat = mlocListener.getLatitude();
lon = mlocListener.getLongitude();
于 2013-10-16T04:09:16.947 回答
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);
于 2014-04-24T05:27:28.657 回答
1

Google 更新了其位置处理逻辑。现在使用融合的位置提供程序更容易收听位置更新。您可以在 5 分钟内实现您的位置侦听器。看一看。 获取最准确位置的方法

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

于 2013-10-16T07:58:32.373 回答
0

LocationManager 使用缓存中的最后一个已知位置。加载谷歌地图时缓存会更新。试试这个,出去看看你的位置。移动到大约 200m 的不同位置并再次检查您的位置。它将与旧的相同。现在,加载谷歌地图,你会发现你的应用程序神奇地有了新的位置。

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

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) {
    }
});
于 2013-10-16T07:42:53.607 回答