安卓定位服务不更新 requestLocationUpdates

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语句之前将值传递给latlon。我该如何实现这一点?

你在清单文件中添加了位置权限(android.permission.ACCESS_FINE_LOCATION)吗? - prijupaul
如果您正在模拟器上测试,则需要将坐标传递给它;如果您在设备上,请重新启动设备并检查。 - Shrikant
@Shrikant 我正在我的设备上进行测试。正如我所说,在GPSListener中它能够获取GPS坐标,因此我不认为这是通信错误。我认为更有可能是语法错误。 - Barry Tormey
4个回答

3

您正在使用公共静态字段来存储纬度和经度。

请将其更改为非静态,并使用setter、getter与实例化对象:

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

您可以使用以下代码替换原有代码: Location loc = mlocManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 该代码可以获取到设备最近的 GPS 位置信息。 - tho nguyen

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);

1
谷歌更新了位置处理逻辑。现在使用融合位置提供程序更容易监听位置更新。您可以在5分钟内实现位置侦听器。请查看以下链接:获取最精确位置的方法
如果您只监听GPS提供程序,但它尚未准备好(等待位置状态),则不会返回任何位置。请尝试使用融合位置提供程序,并重新编写您的位置侦听器。

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) {
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接