【问题标题】:GPS results vary over old and new APIsGPS 结果因新旧 API 而异
【发布时间】:2016-06-30 10:19:21
【问题描述】:

由于我不定期地编写我的应用程序,我使用的一些 API 在我回来时已被弃用。
最值得注意的是 GPS API 的变化。让我感到困惑的是,较旧的 API 似乎提供了更好的结果(代码将随之而来)。
我正在使用 MapView,并且还使用较旧的方法(单独的 gps 和网络提供商)和较新的方法(“FusedLocation”)以编程方式获取 GPS 坐标。
我在谷歌地图中比较了这两个代码的坐标,虽然旧代码(单独使用 gps 和网络提供商)准确且稳定,但新代码(使用“FusedLocation”)偏离了几百米并且不稳定,尽管匹配mapView 指向的位置(意味着它们都不是那么准确并且不断变化)。

所以我的问题是,哪种方法是正确的使用方法?我想也许我的 FusedLocation 编码错误,但由于它与 MapView 匹配,我排除了这个。

旧代码,分别使用 GPS 和网络:

public Location getLocation() {
    locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
    isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        if(!isGPSEnabled && !isNetworkEnabled) {

        } else {
            this.canGetLocation = true;
            if (isGPSEnabled) {
                locationManager.requestLocationUpdates(
                        LocationManager.GPS_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.GPS_PROVIDER);

                }
            }
                if(isNetworkEnabled) {
                if(location == null) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    if(locationManager != null) {
                        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    }
                }
            }
        }


使用 FusedLocation 的新代码:

protected synchronized void buildGoogleApiClient() {
    mGoogleApiClient = new GoogleApiClient.Builder(context)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
}

public boolean canGetLocation() {
    boolean isGPSEnabled = false;
    boolean isNetworkEnabled = false;
    try {
        LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        isGPSEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
        isNetworkEnabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
//some more code
}

public void onConnected(Bundle bundle) {
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

}

【问题讨论】:

  • 使用哪种方法正确? ...用于什么?为了获得确切的位置?不是他们......你应该设置监听器并等待提供者修复......似乎是来自androidhive的另一个“伟大”代码..
  • hahaha androidhive 规则locationManager.requestLocationUpdates(...); if(locationManager != null) { ... } 在您调用一次方法后立即检查locationManager 是否为空有什么意义?为时已晚...如果locationManager 为空,那么您将获得 NPE 行之前 ..
  • 而不是像我所说的那样模拟一个相当旧的代码,你能给我推荐一个更好的编码示例吗?或尝试帮助我理解为什么它实际上更准确?

标签: android gps


【解决方案1】:

您应该使用新的 API,FusedLocationProviderAPI 包括高精度、低电池使用和低内存使用。但是 android.location 现在已被弃用。

查看此文档了解更多信息 - https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderApi

【讨论】:

  • 谢谢,但如您所见,我(认为)我正在使用 FusedLocation(检查第二个代码)。有什么想法吗?
  • 我知道您正在使用 FusedLocation。我只是在回答您的问题“使用哪种方法正确?”请检查答案中提供的文档。
  • 感谢和抱歉,您确实尝试提供帮助。我会尝试再次查看文档,看看为什么我会得到不好的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
  • 2019-07-20
相关资源
最近更新 更多