Android Fused Location API 在 onLocationChanged 中给出了不准确的位置
Posted
技术标签:
【中文标题】Android Fused Location API 在 onLocationChanged 中给出了不准确的位置【英文标题】:Android Fused Location API gives inaccurate Location in onLocationChanged 【发布时间】:2016-12-09 06:03:54 【问题描述】:我在这里有点挣扎,我正在使用 Fused API 来获取位置更新。我的目的是当用户走路时在地图上画一条路径。
我已经实现了如下:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
View view = inflater.inflate(R.layout.map_layout, container, false);
// some other initialization
//....
//
if (mGoogleApiClient == null)
mGoogleApiClient = new GoogleApiClient.Builder(mContext)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
return view;
然后我按照下面的方法开始做东西
private void startReceivingLocationUpdates()
if (checkGPSPermission() && mGoogleApiClient.isConnected() && !isReceivingLocationUpdates)
LocationRequest locationRequest = new LocationRequest();
locationRequest.setInterval(5000);
locationRequest.setFastestInterval(5000);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
locationRequest, this);
isReceivingLocationUpdates = true;
&在这里我收到位置更新
@Override
public void onLocationChanged(Location location)
if(getDistanceBetweenTwoLacation(mCoordinates.get(mCoordinates.size() - 1), location) > 3d)
for(int i= 0; i < mCoordinates.size(); i++)
Location locationTemp = mCoordinates.get(i);
Log.d(TAG, "i => " + i + " Lat => " + String.valueOf(locationTemp.getLatitude()) + " Lng => " + String.valueOf(locationTemp.getLongitude()));
if(mCoordinates.size() > 0)
Log.d(TAG, "lat difference is => " + getDistanceBetweenTwoLacation(mCoordinates.get(mCoordinates.size() - 1), location));
mCoordinates.add(location);
现在的问题是,onLocationChanged
使用 lat-lng 给出位置,即使设备稳定在同一个地方,它与过去位置的差异/距离也有 5-90 米左右。我错过了什么吗?
顺便说一句,这是返回我使用的两个 lat-lngs 距离的方法
private double getDistanceBetweenTwoLacation(Location origin, Location destination)
return origin.distanceTo(destination);
【问题讨论】:
您是在室内进行所有这些测试吗?如果是这样,它跳来跳去很正常。检查准确度值,您会发现它非常高,表明位置存在很多不确定性。 你在清单中有什么权限? @user3137702 是的,我正在室内进行测试... @Matias Elorriaga 这里是权限在室内时,GPS 定位不准确(以及移动/漂移/跳跃)非常普遍。如果没有清晰的天空视野,就不可能进行准确的 GPS 定位。在您的 Location
对象中,有一个 getAccuracy()
方法返回一个浮点数。该值是以米为单位的定位精度,置信度为 68%(1 个标准差),代表圆的半径。
在室内,您可能会看到 20、30 甚至 50 米的准确度值,而经纬度在该距离内跳跃。一旦在户外,准确度值应该会下降到 10 米以下,通常会低于 5 米,并且您的位置会跳动的频率大大降低。
tl;dr : GPS 在室内无法给出准确的结果。
【讨论】:
以上是关于Android Fused Location API 在 onLocationChanged 中给出了不准确的位置的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 FUSED LOCATION API 优化电池 - Android
Android:关闭位置时,Google Fused Location 不起作用
Android:使用 Fused Location Provider 检查是不是启用了位置服务
Android - Google Maps V2 无法使用 Fused Location
Android 的 Fused Location Provider 的 LocationRequest 优先级有啥区别?