能够获取当前位置但不准确

时间:2014-11-23 16:52:59

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

这个问题可能会重复,但我对其他人不满意,这就是为什么再次询问.i创建了一个简单的应用程序来显示当前位置并将其显示在地图上。但它不准确。我在建筑物内测试了我的应用程序并取得附近的道路作为我当前的位置,但其他应用程序,如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);*/

    }
}

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

3 个答案:

答案 0 :(得分:1)

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

  

尽管GPS最准确,但它只适用于室外。

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

  

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

你必须知道:(使用getLastLocation()时)

  

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

BUT:

  

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

还请看一下以了解有关维持当前最佳估算的更多信息:

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

您可能会收到陈旧的位置数据,因为您正在使用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对象的准确性。您可以通过许多其他方式设置您的侦听器,但这就是我在其中一个应用程序中执行此操作的方式。如果你谷歌像“android位置更新”,你应该找到一些其他好的教程。祝好运!