首页 > 解决方案 > Android 设备稳定 - 仅在一个地方,但有时行驶公里数仍超过 2 公里

问题描述

我正在开发一个应用程序,我正在使用FusedLocationProviderClient获取用户当前位置。类似于下面的代码。我无法理解为什么它将当前位置作为不同的位置,有时它距离当前位置2+KM并且设备只是在一个地方稳定

private void getLastLocation() {
        try {
            mFusedLocationClient.getLastLocation()
                    .addOnCompleteListener(new OnCompleteListener<Location>() {
                        @Override
                        public void onComplete(@NonNull Task<Location> task) {
                            if (task.isSuccessful() && task.getResult() != null) {
                                mLocation = task.getResult();

                                onNewLocation(mLocation);

                            } else {
                                Log.e(TAG, "Failed to get location.");
                                mLocation = null;
                            }
                        }
                    });




        } catch (SecurityException unlikely) {
            //Log.e(TAG, "Lost location permission." + unlikely);
        }

上面的代码在前台服务中......现在的问题是当用户设备稳定但在运行应用程序 5-6 小时后它返回不同的当前位置,即使设备在同一个地方(没有移动)

实际结果:它不应该给我用户行驶的任何公里。我通过用户计算旅行的 KM 类似于下面的代码

double distanceInMeters = currentLocation.distanceTo(priviusLocation);

                    if (distanceInMeters > getSharedPref.getDefaultDistance() && (mLocation.getAccuracy() < Config.ACCURACY ) //Config.ACCURACY==>70{
//                if (distanceInMeters > getSharedPref.getDefaultDistance()) {//getSharedPref.getDefaultDistance()==>10
                        if (mLocation.getLatitude() > 0) {
                            getSharedPref.setPreviousLocation(String.valueOf(mLocation.getLatitude()), String.valueOf(mLocation.getLongitude()));
                            writeDataInLogFile("this set to previous ", String.valueOf(mLocation.getLatitude()) + "  getLongitude " + String.valueOf(mLocation.getLongitude()));
                        }
                        data.setGPS_Km_Travelled(String.format("%.2f", distanceInMeters / 1000));
                        data.setGPS_Is_Loc_Changed("1");

                    }

标签: androidlocationfusedlocationproviderclient

解决方案


融合位置提供程序的工作方式是,它结合来自设备 GPS 的数据以及来自 Google 的网络信息,使用设备的蜂窝网络和 WiFi 信息以及来自您设备的其他信息。

有时会发生的情况是,当您将设备留在几乎没有 GPS 连接的区域时,会使用来自设备的网络信息来推断用户的位置。这有时精确到 30m,但有时融合位置提供者给出的位置可能不精确到几公里。因此,即使物理设备从未移动,您的应用程序可能会认为设备已移动,因为当前位置已更改。

为了解决这个问题,您有必要实施一种算法来根据某些标准过滤收到的位置。例如,如果该位置的“准确度”值可能高于 100m,那么它甚至不值得考虑作为有效位置,因为用户实际上可能距离 api 返回的位置最多 3 公里。此外,如果用户的当前位置距离上一个位置太远,那么您应该检查新位置是否可以被认为是准确的(一个人通常不能以超过几公里/小时的速度移动)

祝您工作顺利!


推荐阅读