【问题标题】:How to get the correct location despite the android location bugs尽管存在 android 位置错误,如何获得正确的位置
【发布时间】:2015-11-26 08:49:22
【问题描述】:

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

尝试 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));
    }


};

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

【问题讨论】:

  • 我使用了融合和原生位置 api。两者都工作正常。吃了你确定你遵循了这个文档developer.android.com/training/location/… 的每一步吗?例如你应该在 api 客户端的 onConnected() 中 requestLocationUpdates()。
  • 我已经发布了所有适用的代码,如果你有什么特别之处,请告诉我。据我所知,它与教程没有什么不同,因为我基本上将它复制到其中。

标签: android geolocation


【解决方案1】:

您无法保证每分钟都能获得位置信息。最好的办法是向 LocationManager 系统服务注册一个LocationListener。您可以将 minDistance 参数设置为非常低的值,例如 10m,以获得非常定期的更新。

这一切都应该在后台线程中完成,并且会影响电池寿命。如果您不需要在您的应用中定期准确地知道位置,那么使用 Google Play Services 之类的工具来获取最后一个已知位置是一个不错的折衷方案。

【讨论】:

    【解决方案2】:

    查看您之前的问题作为链接:

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

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

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

    如果您确实有上述代码,请确保您的位置设置在您的设备上设置为高精度,并且您拥有适当的清单权限(粗略和精细准确度),然后在此处发布您的代码。

    这两个位置 API 都可能很麻烦,但它们绝对不会像您描述的那样被窃听。我已经在我正在创建的应用程序中尝试了这两种方法,并且始终能够获得准确的结果。

    【讨论】:

    • 是的,我已经做到了。它仍然每分钟接收更新,并且每次都不同,它们恰好在同一个区域而不是我搬到的地方。我将更新问题以包含代码。
    猜你喜欢
    • 2021-07-07
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 2012-02-02
    • 1970-01-01
    • 2014-09-20
    相关资源
    最近更新 更多