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

标签 android android-fusedlocation

我在这里有点挣扎,我正在使用 Fused API 来获取位置更新。我的目的是当用户行走时在 map 上绘制一条路径。

我的实现如下:

    @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 给出的位置带有经纬度,即使设备稳定在同一位置,其与过去位置的差异/距离也多次约为 5-90 米。我错过了什么吗?

顺便说一句,这是返回我使用的两个经纬度距离的方法

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

最佳答案

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

在室内时,您可能会看到 20、30、甚至 50 米的精度值,而经纬度和经度则在该距离内跳跃。一旦到了室外,精度值应该下降到 10 米以下,通常是 5 米以下,并且您的位置跳动的频率会大大降低。

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

关于Android Fused Location API 在 onLocationChanged 中提供不准确的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38744907/

相关文章:

java - Android 异常 NameNotFoundException

android - 等到 GPS 启用后再获取 FusedLocationAPI 中的纬度和经度值

google-api - Android FusedLocationClient 不请求新样本

android - 请求位置更新的频率超过 5 秒(Android Fused 位置)

android - 当应用程序处于后台时,不会触发地理围栏转换

Android 布局编辑器无法打开文件

android - INSTALL_FAILED_DEXOPT 永久破坏项目?

android - 由于OneSignal无法解决依赖关系

java - 如何使用 FusedLocation API 每 5 分钟接收一次位置更新

java - 如何等待异步方法