尽管android位置错误,如何获得正确的位置

时间:2015-11-25 19:42:03

标签: android geolocation

目标:每分钟记录一次用户位置。

尝试1: Google位置服务API

我发现这种方法给出了不准确的结果。我会留下一个位置,而不是说我离家几英里,它会说我在10米之外。有时它会在10分钟左右后自行纠正,有时需要3个小时或更长时间。

public class timesheetService extends Service implements
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener,
    LocationListener {

private static GoogleApiClient mGoogleApiClient;
private static LocationRequest mLocationRequest;
private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
 private void locationSetup(){
    int interval = 120000;
    // Create the LocationRequest object
    mLocationRequest = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
            .setInterval(interval)        // 2 mins, in milliseconds
            .setFastestInterval(10000); // 1 second, in milliseconds

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();

    mGoogleApiClient.connect();
}

@Override
public void onConnected(Bundle bundle) {
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}

private void handleNewLocation(Location location) {
   Log.i("location", String.valueOf(location));
}

更详细的信息可以在我未提出的问题中找到:Does Google Location Services return old locations?

尝试2:内置位置API

除了重新启动设备之前没有侦听位置更改的新设备上的主要错误之外,此方法非常有效。如下所述:https://code.google.com/p/android/issues/detail?id=57707

  private LocationManager locationManager;

public void getLocation2() {
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
            60 * 1000,//seconds * milliseconds
            0, // distance (meters)
            LListener);
}
android.location.LocationListener LListener = new android.location.LocationListener(){
    @Override
    public void onLocationChanged(Location location) {
        Log.i("classic", String.valueOf(location));
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        Log.i("status", String.valueOf(status));
    }


};

那么人们怎么做呢?我知道它一定是可能的,但我已经坚持了几个星期这个问题,我不明白为什么这两种方法都不能正常工作。

2 个答案:

答案 0 :(得分:0)

您不能保证每分钟都能获得一个位置。您可以实现的最佳方法是使用LocationManager系统服务注册LocationListener。您可以将minDistance参数设置为一个非常低的值,例如10米,以获得非常有规律的更新。

这应该都是在后台线程中完成的,并且会影响电池寿命。如果您不需要在应用中定期准确了解该位置,那么使用Google Play服务等内容获取最后一个已知位置是一个很好的权衡。

答案 1 :(得分:0)

将上一个问题视为链接:

您是否确保注册位置更新?

LocationServices.FusedLocationApi.requestLocationUpdates(
        mGoogleApiClient, mLocationRequest, this);

如果没有,您的代码可能会收到一次最后的已知位置,然后不再请求更新。请查看此处的代码段:http://developer.android.com/training/location/receive-location-updates.html

如果您有上述代码,请确保您的位置设置在您的设备上设置为高精度,并且您具有相应的Manifest权限(粗略和精确的准确度),然后在此处发布您的代码。

两个位置API都可能很有用,但绝对没有你所描述的程度。我已经在我创建的应用程序中尝试了这两种方法,并且始终能够获得准确的结果。