Android:LocationListener和getLastKnownLocation

时间:2014-04-08 21:10:29

标签: android gps location locationlistener

我有一个每分钟运行的服务,并且应该不断跟踪位置。该服务实现了LocationListener。我觉得我没有正确理解这一点,因为我实际上并没有使用LocationListener方法: onLocationChanged onProviderEnabled onProviderDisabled 等

我的课程中有这些方法但我实际上并没有对它们做任何事情。我所做的就是每次运行我的服务时都会根据可用的GPS和网络提供商调用LocationManager.getLastKnownLocation。

这就是我的代码:

服务每分钟运行一次:

Intent i = new Intent(context, GPSTracker.class);
    PendingIntent pi = PendingIntent.getService(context, 0, i, 0);

    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    if(isOn) {
        alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), POLL_INTERVAL, pi);
    } else {
        alarmManager.cancel(pi);
        pi.cancel();
    }

我处理意图:

protected void onHandleIntent(Intent intent) {
    Log.i(TAG, "In onHandleIntent!");
    Location currentLocation = getLocation(this);
    if(currentLocation == null) {
        saveLocation(-8.0, -8.0, "nothing", "nothing", "nothing");
    } else {
        Geocoder geocoder;
        List<Address> addresses;
        geocoder = new Geocoder(this, Locale.getDefault());
        try {
            addresses = geocoder.getFromLocation(latitude, longitude, 1);
            String city = addresses.get(0).getLocality();
            String country = addresses.get(0).getCountryCode();
            String state = addresses.get(0).getAdminArea();
            saveLocation(currentLocation.getLatitude(), currentLocation.getLongitude(), city, state, country);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

getLocation()可以完成真正的工作:

 public Location getLocation(Context context) {
    try {
        locationManager = (LocationManager) context
                .getSystemService(LOCATION_SERVICE);

        // getting GPS status
        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
        } else {
            this.canGetLocation = true;
            if (isNetworkEnabled) {
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network");
                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
                if (location == null) {
                    locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("GPS Enabled", "GPS Enabled");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return location;
}
但有些事似乎并不合适。首先,就像我说的那样,我不使用任何LocationListener方法,而且它似乎也不是很准确。当我在坐在电脑桌前的手机上进行测试时,每次都能看到它。然而,今天我在工作时曾经在手机上运行,​​而另一次我在街上行走时,这些地方的位置距离他们两英里。奇怪的是,它为这两个地方提供了完全相同的错误位置。这些都是网络提供商,因为我没有使用GPS。

我做错了什么,如果我没有做错任何事,我怎样才能让它更准确?

2 个答案:

答案 0 :(得分:0)

getLastKnownLocation()将提供最后的已知位置(不是当前位置)。如果设备已关闭并移动到其他位置,则位置可能已过期。

您需要使用LocationClient来使用Google定位服务获取当前位置。它易于集成。您需要为LocationClient创建一个实例并进行连接。建立连接时有回调方法。一旦连接,您可以从mLocationClient.getLastLocation()中检索当前位置(返回当前可用的最新位置)。

点击此链接https://developer.android.com/training/location/retrieve-current.html

答案 1 :(得分:0)

由于您的关注是要获得更准确的结果,那么您应该使用GPS。您只需添加GPS启用按钮即可要求用户打开GPS。

gpsButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                isGpsON = true;
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(intent);

        }
    });

您没有使用任何LocationListener,但我认为您应该使用它来进行位置更新

@Override
public void onProviderEnabled(String provider) {
    getLocation(this);
}