GPS结果因新旧API而异

时间:2016-06-30 10:19:21

标签: android gps

由于我是以不定期的间隔编写应用程序,因此我使用的某些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);

}

1 个答案:

答案 0 :(得分:0)

你应该使用新的API,FusedLocationProviderAPI包括高精度,低电池使用和低内存使用。但是现在不推荐使用android.location。

查看此文档了解详情 - https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderApi