【问题标题】:Able to fetch current location but its not accurate能够获取当前位置,但不准确
【发布时间】:2014-11-23 16:52:59
【问题描述】:

这个问题可能是重复的,但我对其他人不满意,这就是为什么再次询问。我创建了一个简单的应用程序来显示当前位置并将其显示在地图上。但它不准确。我在建筑物内测试了我的应用程序并且正在获取附近的道路作为我当前的位置,但是 Myteksi、Grab teksi 等其他应用程序将我的公司名称显示为当前位置及其准确。我不知道为什么会这样。请帮助。获取当前位置的代码如下/p>

protected void gotoCurrentLocation() {
    Location currentLocation = mLocationClient.getLastLocation();
    if (currentLocation == null) {
        Log.d("currentLocation-->>>", "null");
        Toast.makeText(this, "Current location isn't available",
                Toast.LENGTH_SHORT).show();
    } else {
        LatLng ll = new LatLng(currentLocation.getLatitude(),
                currentLocation.getLongitude());
        Log.d("lattitude", currentLocation.getLatitude()+"");
        Log.d("longitude", currentLocation.getLongitude()+"");

        CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll,
                DEFAULTZOOM);
        map.animateCamera(update);
        /*String address= service.GetAddress(currentLocation.getLatitude(),
                currentLocation.getLongitude());
        Log.d("address", address);*/

    }
}

如果需要任何其他代码,请发表评论。

【问题讨论】:

    标签: android google-maps-android-api-2 currentlocation


    【解决方案1】:

    正如您所说,您在室内位置测试应用。而且你知道在室内位置 GPS 传感器将无法工作,根据谷歌的文档:

    虽然 GPS 最准确,但它只适用于户外。

    因此,您的位置可能来自使用 wi-fi 或 cell-id 的网络提供商,这不够准确。

    Android 的网络位置提供程序使用手机信号塔和 Wi-Fi 信号确定用户位置,以在室内和室外都适用的方式提供位置信息。

    您必须注意这一点:(使用 getLastLocation() 时)

    要获取当前位置,请创建一个位置客户端,将其连接到位置服务,然后调用其 getLastLocation() 方法。根据您的应用请求的权限和当前启用的位置传感器,返回值是最近的最佳位置。

    但是:

    当前位置仅在位置客户端连接到位置服务时保持。假设没有其他应用连接到定位服务,如果您断开客户端连接,然后稍后调用 getLastLocation(),结果可能已过期

    还请查看此内容以了解有关维持当前最佳估计的更多信息:

    http://developer.android.com/guide/topics/location/strategies.html#BestEstimate

    我希望这些信息对您有所帮助。 ;)

    【讨论】:

      【解决方案2】:

      这是因为获取位置是一项非常复杂的任务。而且LocationClient的原生植入可能不是最准确的。

      考虑在您的设备中使用一个或全部 13 个传感器 (Table 1) 来改善这一点。

      • TYPE_ACCELEROMETER 硬件 测量在所有三个物理轴(x、y 和 z)上施加到设备的加速力(以 m/s2 为单位),包括重力。运动检测(摇晃、倾斜等)。
      • TYPE_AMBIENT_TEMPERATURE 硬件 测量环境室温,以摄氏度 (°C) 为单位。请参阅下面的注释。监测气温。
      • TYPE_GRAVITY 软件或硬件 以 m/s2 为单位测量施加到所有三个物理轴(x、y、z)上的设备的重力。运动检测(摇晃、倾斜等)。
      • TYPE_GYROSCOPE 硬件 测量设备围绕三个物理轴(x、y 和 z)中的每一个的旋转速率(以 rad/s 为单位)。旋转检测(旋转、转弯等)。 TYPE_LIGHT 硬件 以 lx 为单位测量环境光水平(照度)。控制屏幕亮度。
      • TYPE_LINEAR_ACCELERATION 软件或硬件 以 m/s2 为单位测量在所有三个物理轴(x、y 和 z)上应用于设备的加速力,不包括重力。监控沿单轴的加速度。
      • TYPE_MAGNETIC_FIELD 硬件 测量所有三个物理轴(x、y、z)的环境地磁场,单位为 μT。制作指南针。
      • TYPE_ORIENTATION 软件测量设备围绕所有三个物理轴(x、y、z)的旋转度数。从 API 级别 3 开始,您可以通过将重力传感器和地磁场传感器与 getRotationMatrix() 方法结合使用来获取设备的倾斜矩阵和旋转矩阵。确定设备位置。
      • TYPE_PRESSURE 硬件 以 hPa 或 mbar 为单位测量环境气压。监测气压变化。
      • TYPE_PROXIMITY 硬件 测量对象相对于设备查看屏幕的距离(以厘米为单位)。该传感器通常用于确定手机是否被举到人耳边。通话期间的电话位置。
      • TYPE_RELATIVE_HUMIDITY 硬件 以百分比 (%) 测量相对环境湿度。监测露点、绝对湿度和相对湿度。
      • TYPE_ROTATION_VECTOR 软件或硬件通过提供设备旋转矢量的三个元素来测量设备的方向。运动检测和旋转检测。
      • TYPE_TEMPERATURE 硬件 以摄氏度 (°C) 测量设备的温度。此传感器实现因设备而异,此传感器已替换为
      • API 级别 14 监测温度中的 TYPE_AMBIENT_TEMPERATURE 传感器

      【讨论】:

        【解决方案3】:

        当您使用LocationClient.getLastKnownLocation() 时,您可能会得到陈旧的位置数据,它返回最后一个缓存 位置,而不是当前位置。您可以尝试使用LocationListener 请求您自己的位置更新。为此,您需要创建自己的 LocationListener 并覆盖默认的 onLocationChanged(Location) 行为。例如:

        final LocationListener ll = new LocationListener(){
        
            int i=0;
        
            @Override
            public void onLocationChanged(Location loc) {
        
                if(i < 5 && loc.getAccuracy() > 8){
                    i ++;
                    return;
                }
                double lat = loc.getLatitude();
                double lon = loc.getLongitude();
                double acc = loc.getAccuracy();
            }
        };
        

        然后您需要使用LocationManager 的实例注册监听器:

        final LocationManager lm  = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
        

        此示例将在 GPS 位置更改时注册侦听器。上面的实际监听器代码等待至少 5 次位置更改,以帮助确保最终位置准确(等待的时间越长,锁定卫星的时间就越长),然后获取纬度、经度和Location 对象的准确性。还有许多其他方法可以设置您的侦听器,但这就是我在我的一个应用程序中所做的方式。如果您在 Google 上搜索“android 位置更新”之类的内容,您应该会找到其他一些不错的教程。祝你好运!

        【讨论】:

        • 我试过你的逻辑。如果你不介意你能提供一些示例代码吗?
        猜你喜欢
        • 1970-01-01
        • 2013-03-16
        • 2013-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多