android中的一般gps问题

时间:2011-09-16 01:30:11

标签: android gps

我几周来一直在搞乱gps功能,我有一个问题。我的目标是在点击按钮时保存gps位置,但是我听说gps需要一些时间来收听卫星才能获得精确的位置。我的程序记录其位置不到一秒钟,让我相信它实际上没有花时间。它记录的位置相当远,有时它甚至不再听新的位置,它只是告诉我,我在几个小时前的某个地方。我应该怎么做,现在我在点击按钮后立即调用requestLocationupdates(Location,0,0,loc_listener),我应该把它放在其他地方吗?(比如在我声明我的位置管理器之后?)

我真的很感激任何帮助。 感谢

这是我的创建方法

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

    location = locationManager
            .getLastKnownLocation(LocationManager.GPS_PROVIDER);
    loc_listener = new LocationListener() {

        @Override
        public void onStatusChanged(String provider, int status,
                Bundle extras) {
            // TODO Auto-generated method stub
            float locationAccuracy = location.getAccuracy();
            if (locationAccuracy > 150) {
                gpsStatus.setImageResource(gpsColor[0]);
            } else if (locationAccuracy > 100) {
                gpsStatus.setImageResource(gpsColor[1]);
            } else {
                gpsStatus.setImageResource(gpsColor[2]);
            }
        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onLocationChanged(Location location) {
            // TODO Auto-generated method stub

        }
    };

我在我的onbuttonclick方法中调用它

        locationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, 30000, 0,
                loc_listener);

holder.put("lat", location.getLatitude());
holder.put("lon", location.getLongitude());

我应该做什么呢?感谢

4 个答案:

答案 0 :(得分:0)

如果我是你,我会使用MyLocationOverlay,这是为了获取用户的位置。

然后,您可以在获取位置时使用getMyLocation()

答案 1 :(得分:0)

答案 2 :(得分:0)

你为什么不使用这个功能:

public void onLocationChanged(Location location) {
   // TODO Auto-generated method stub
}

知道位置何时发生变化?您可以在有任何更改时自行跟踪,并在您单击按钮时使用跟踪的位置,而不是再次请求更新。

来自文档:

http://developer.android.com/reference/android/location/LocationListener.html#onStatusChanged%28java.lang.String,%20int,%20android.os.Bundle%29

onStatusChanged用于GPS上线/离线/暂时不可用/等

答案 3 :(得分:0)

您需要在搜索中进行分层才能获得最佳排名。现在,您只使用GPS提供商并利用网络提供商尝试找到您的位置。分层GPS位置在Obtaining User's Location部分“用于获取用户位置的流程”中进行了描述

现在与您的问题有关,点击按钮:

  • 您需要先检查缓存,然后查看该缓存是否过时而无法使用。使用您最好的提供商这样做。这是您从
  • 开始的框架代码


LocationManager lm = (LocationManager)activity.getSystemService(Context.LOCATION_SERVICE);  
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
String bestProvider = lm.getBestProvider(criteria, true);
Location locate = lm.getLastKnownLocation(bestProvider);

if (locate != null) {
    // if current location is already within time to expire apart, then get current location
    // Check if we have cached location in the last 2 minutes, use that cached if we have one
    if(System.currentTimeMillis() - locate.getTime() > TIME_TO_EXPIRE) {
        // cache is too old and we assume the user has moved since then, initiate GPS location update
    } else {
        // cache is not too old, we could call the locationListener here itself
        locationListener.onLocationChanged(locate);
    }
}  else {
    // Use GPS if no known cache is available. Wait for 7.5 secs for GPS lock
}
  • 如果我们没有获得不太旧的缓存,我们需要开始收听更新,让我们从GPS开始

lm.requestLocationUpdates(
        LocationManager.GPS_PROVIDER, 
        MIN_TIME, 
        MIN_DISTANCE, 
        locationListener);
  • 您需要对GPS搜索进行计时,看看您是否确实在合理的时间范围内锁定并获取位置更新。如果在一定时间限制内,您没有获得GPS锁定和位置更新,您可能会认为GPS无法获取您的位置并继续使用网络提供商搜索您的位置。在进入下一层位置搜索之前,您可以使用Timer.schedule来安排超时。
    • 如果您获得对GPS的锁定并获取位置更新,您首先要比较此位置是否确实比您通过getLastKnownLocation获得的位置更好。上面的Android开发人员链接有一个关于如何确定“维持当前最佳估计值”
    • 部分的示例
    • 否则,如果已经过了一段时间,您可能会决定根据NetworkProvider监听更新。如果这不适合您的应用,则需要提醒用户无法找到当前位置。
  • 如果您决定根据NetworkProvider查找您的位置,那么您会将下一行代码放入

// remove the previous listeners based on GPS
lm.removeUpdates(locationListener);

// now request a new one based on the network
lm.requestLocationUpdates(
        LocationManager.NETWORK_PROVIDER, 
        MIN_TIME, 
        MIN_DISTANCE, 
        locationListener);
  • 然后你会再次发起一个计时器。如果在计时器结束后尚未获取位置,则您必须报告无法获取该位置给用户或使用旧的缓存位置(如果可用),因为您已用尽所有选项获得定位