Android Fused Location API在onLocationChanged中提供了不准确的位置

时间:2016-08-03 13:23:01

标签: android android-fusedlocation

我在这里苦苦挣扎,我正在使用Fused API获取位置更新。我的目的是在用户走路时在地图上绘制路径。

我已经实现了如下:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.map_layout, container, false);

        // some other initialization
        //....
        //
        if (mGoogleApiClient == null) {
            mGoogleApiClient = new GoogleApiClient.Builder(mContext)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();
        }

        return view;
    }

然后我按照方法

启动这些东西
private void startReceivingLocationUpdates() {
        if (checkGPSPermission() && mGoogleApiClient.isConnected() && !isReceivingLocationUpdates) {
            LocationRequest locationRequest = new LocationRequest();
            locationRequest.setInterval(5000);
            locationRequest.setFastestInterval(5000);
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
                    locationRequest, this);
            isReceivingLocationUpdates = true;
        }
    }

&安培;在这里,我收到了位置更新

@Override
    public void onLocationChanged(Location location) {
      if(getDistanceBetweenTwoLacation(mCoordinates.get(mCoordinates.size() - 1), location) > 3d) {
            for(int i= 0; i < mCoordinates.size(); i++) {
                Location locationTemp = mCoordinates.get(i);
                Log.d(TAG, "i => " + i + " Lat => " + String.valueOf(locationTemp.getLatitude()) + " Lng => " + String.valueOf(locationTemp.getLongitude()));
            }
            if(mCoordinates.size() > 0)
                Log.d(TAG, "lat difference is => " + getDistanceBetweenTwoLacation(mCoordinates.get(mCoordinates.size() - 1), location));
            mCoordinates.add(location);
        }
    }

现在的问题是,onLocationChanged给出了lat-lng的位置,即使设备在同一个地方稳定,其与过去位置的差异/距离大约为5-90米。我错过了什么吗?

顺便说一句,这里的方法是返回我用过的两个lat-lngs的距离

private double getDistanceBetweenTwoLacation(Location origin, Location destination) {
        return origin.distanceTo(destination);
    }

1 个答案:

答案 0 :(得分:1)

在室内很常见时,GPS修复不准确(以及移动/漂移/跳跃)GPS修复。如果没有清晰的天空视野,准确的GPS定位是不可能的。在Location对象中,有一个getAccuracy()方法返回一个浮点数。此值是以米为单位的定位精度,为68%(1标准差)置信度,表示圆的半径。

在室内,你可能会看到精确度值为20,30,甚至可能是50米而Lat&amp;在那段距离内跳远。一旦到户外,准确度值应降至10米以下,通常低于5米,并且您的位置将不那么频繁地跳跃。

tl; dr:GPS无法在室内提供准确的结果。