0

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

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);*/

    }
}

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

4

3 回答 3

1

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

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

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

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

你必须意识到这一点:(使用 getLastLocation() 时)

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

但:

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

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

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

我希望这个信息帮助。;)

于 2014-11-27T08:54:27.137 回答
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对象的准确性。还有许多其他方法可以设置您的监听器,但这是我在我的一个应用程序中所做的方式。如果您在 Google 上搜索“android 位置更新”之类的内容,您应该会找到其他一些不错的教程。祝你好运!

于 2014-11-23T17:28:32.093 回答
0

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

考虑在您的设备中使用一个或全部 13 个传感器(表 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 硬件 测量所有三个物理轴(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 传感器监控温度
于 2014-11-23T17:11:56.937 回答