Android获取当前位置问题

Android获取当前位置问题,android,location,android-gps,android-fusedlocation,Android,Location,Android Gps,Android Fusedlocation,我在安卓系统中获取当前位置时面临一个问题 我正在使用安卓系统。但是我得到的纬度和经度并不准确。我将这些凭证粘贴在谷歌地图上,它显示的是一个与我的准确位置不同的地方 我还尝试获取位置更新,并通过location.getAccurance()验证了精度,这里我得到的最小精度是10米。 这里我使用精细位置作为许可。 所以我的问题是,我怎样才能得到我的准确位置,换句话说,准确度小于5米 我的代码是 GoogleApiClient mGoogleApiClient = new GoogleApiClien

我在安卓系统中获取当前位置时面临一个问题

我正在使用安卓系统。但是我得到的纬度和经度并不准确。我将这些凭证粘贴在谷歌地图上,它显示的是一个与我的准确位置不同的地方

我还尝试获取位置更新,并通过
location.getAccurance()
验证了精度,这里我得到的最小精度是10米。 这里我使用精细位置作为许可。 所以我的问题是,我怎样才能得到我的准确位置,换句话说,准确度小于5米

我的代码是

GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .enableAutoManage(this, this)
                .build();

    LocationRequest mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
    mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
    mLocationRequest.setSmallestDisplacement(1);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest,MainActivity.this);

 @Override
public void onLocationChanged(Location location) {
    Toast.makeText(MainActivity.this,";-"+location.getAccuracy(),Toast.LENGTH_LONG).show();
    if(location.hasAccuracy() && location.getAccuracy()<lastLocationAccuracy){ 
        latitude = location.getLatitude();
        longitude = location.getLongitude();
    }
}
GoogleApiClient mGoogleApiClient=new GoogleApiClient.Builder(此)
.addConnectionCallbacks(此)
.addOnConnectionFailedListener(此)
.addApi(LocationServices.API)
.enableAutoManage(这个,这个)
.build();
LocationRequest MLLocationRequest=新的LocationRequest();
mLocationRequest.setInterval(以毫秒为单位更新间隔);
mLocationRequest.SetFastTestInterval(最快的更新间隔,以毫秒为单位);
M定位请求。设置最小位移(1);
mLocationRequest.setPriority(位置请求.优先级高精度);
LocationServices.FusedLocationApi.RequestLocationUpdate(mgoogleapClient、mlLocationRequest、MainActivity.this);
@凌驾
已更改位置上的公共无效(位置){
Toast.makeText(MainActivity.this,“;-”+location.getAccurance(),Toast.LENGTH_LONG.show();

如果(location.hasAccurance()&&location.getAccurance()我搜索了很多,但使用fused location API找不到精度低于10的任何东西

如果您看到了演示文稿,将显示一张图表,显示在Galaxy Nexus上多次测试的识别算法的不同优先级的效果

如果你想获得低于10的精度,那么你可以使用GPS,但这也取决于设备、GPS、WiFi、手机发射塔、蓝牙等


如果GPS硬件可以接受校正,它可以做得更好,最坏的情况是7.6米,最好的情况是1-2米。

我搜索了很多,使用融合定位API找不到精度低于10的任何东西

如果您看到了演示文稿,将显示一张图表,显示在Galaxy Nexus上多次测试的识别算法的不同优先级的效果

如果你想获得低于10的精度,那么你可以使用GPS,但这也取决于设备、GPS、WiFi、手机发射塔、蓝牙等

如果GPS硬件可以接受校正,它可以做得更好,最坏的情况是7.6米,最好的情况是1-2米

我怎样才能得到我的准确位置,换句话说,准确度小于5米

简短的回答 在使用位置时,重要的是要了解您可能会要求一定的精度,但不能保证在实际位置更新中获得该精度


通常情况下,您无法获得准确度<5m的位置更新。这取决于许多因素,最重要的是您的设备和物理环境的功能。


长话短说 FusedLocationApi在幕后发挥了巨大的魔力。除此之外,它还试图找出要使用的提供商(GPS、WiFi、手机塔、蓝牙等)。这些提供商在准确性、更新频率和电池消耗方面各有优缺点。然后,它会融合来自不同提供商的信息,因此得名

示例1:如果你在纽约市的一个城市峡谷中,你将很难获得一个准确的GPS定位。另一方面,周围将有大量的WiFi网络,这些网络已经被谷歌映射和地理参考。因此,你很可能得到一个快速定位。准确度将取决于巢穴WiFi网络的可靠性,更重要的是墙壁/建筑物的密度。我不希望在这里得到比15-30米更精确的信息

示例2:如果你在沙漠中的某个地方,情况正好相反。很可能,附近不会有任何WiFi网络,但你会得到一个非常清晰的GPS定位。在这里,你可以预期位置更新的精确度<5m

您的设置看起来正确。选择高更新率和高优先级将确保GPS用作提供商(如果设备上可用)。请确保您在户外测试应用程序,并且可以清楚地看到天空。如果您一直接收到非常遥远的位置,请使用其他设备进行测试。如果它仍然无法工作,则说明您的代码有问题。 您可能希望使用一个实用程序类,例如(完全公开:我是该项目的作者),以确保您正确设置了所有内容

误解 最后,我想澄清我在其他评论中看到的两个常见误解:

  • 如文档中所述,将返回位置读数的估计精度。这是最佳猜测(通常基于高斯误差模型)这可能很遥远。我见过这样的情况:融合定位的准确度为
    3m
    ,距离实际超过
    100m
    。因此不要依赖它来实现关键功能

  • ACCESS\u FINE\u LOCATION
    权限足以获得高精度更新。无需额外指定
    ACCESS\u rough\u LOCATION

我怎样才能得到我的准确位置,换句话说,准确度小于5米

简短的回答 在使用位置时,重要的是要了解您可能会要求一定的精度,但不能保证在实际位置更新中获得该精度


通常情况下,您不能期望获得精度<5m的位置更新。这取决于