android选择最佳定位服务,android的Location strategies(定位策略)

因为要研究定位服务,特开此贴,它是一个翻译贴,用于对定位有一个更好的理解;

定位策略:

对于用户来说,使用户知道他们在哪这种类似应用会给用户带来很好的体验;当开发一款定位的应用程序时,你可以使用两种方式定位,GPS和定位服务商提供的定位。尽管GPS定位很准确,但是它的缺点就是只能用于室外定位,同时,它对于定位结果的响应时间很长而且定位很费电。android网络定位服务商计算出用户的位置通过基站和WIFI的信号强度,并可以同时提供室内外一体定位的定位信息,反应快,耗电量低。为了在应用中获取定位的位置,你可以同时使用GPS定位和网络位置供应商,或者仅仅是其中的一个。

用户定位位置所面临的一些挑战:

从应用之中获取用户的定位信息其实是很复杂的。有以下三个原因会影响定位结果:

1.多种定位源的干扰:GPS,CELL-ID,and

WIFI每一个方式都可以提供定位结果。权衡使用哪种定位方式有以下几个因素:精确度,速度,耗电量

2.用户的位移:你需要频繁的计算出用户的位置,因为他们的位置是一直在变化的。

3.精确度的变化:因为精确度的不同,从每一个定位源中对于定位估算所得到的结果都不是一致的。

这些问题都有可能让用户得不到一个可靠的定位结果,接下来将交您如何避免这些风险从而获得一个精确的定位结果,通过这篇文章你你可以让用户选择理想的定位结果。

定位需求更新:

通过上述的错误描述,下面介绍您将如何获得用户位置;

anroid获取定位结果需要一些回调的方法,声明LocationManager,通过调用requestLocationUpadates()来接收更新的定位结果,传给它一个LocationListener。LocationListener一定要实现一些LocationManager调用的回调方法,用于响应用户位移或者用户服务变化的状态;

例如:如下代码将告诉你如何定义LocationListener和调用用户更新:

//

Acquire a reference to the system Location Manager

LocationManagerlocationManager=(LocationManager)this.getSystemService(Context.LOCATION_SERVICE);

// Define a listener that responds to location updatesLocationListenerlocationListener=newLocationListener(){publicvoidonLocationChanged(Locationlocation){// Called when a new location is found by the network location provider.makeUseOfNewLocation(location);}publicvoidonStatusChanged(Stringprovider,intstatus,Bundleextras){}publicvoidonProviderEnabled(Stringprovider){}publicvoidonProviderDisabled(Stringprovider){}};// Register the listener with the Location Manager to receive location updateslocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,locationListener);

requestLocationUpdates()的第一个参数说明了规定用户使用的定位方式,本文中NETWORK_PROVIDER.第二个参数是两个通知之间的最小间隔时间,第三个参数两个通知之间的最小距离。都设为0就是想要实时更新定位结果。最后一个参数,就是你的LocationListener,用于接收定位更新数据的回调值。

为了从GPS获取定位数据,用GPS_PROVIDER代替NETWORK_PROVIDE。你也可以通过调用两次requestLocationUpdates()

来更新GPS和NETWORK的定位结果。

需要用户权限:

为了接收两种定位结果,需要添加theACCESS_COARSE_LOCATIONorACCESS_FINE_LOCATIONpermission两种权限。如果你使用了两种定位方式,你只需要声明ACCESS_FINE_LOACTION权限即可。

定义一种最佳定位表现模型:

定位应用是个很复杂的事情,但是由于定位准确度,用户移动,以及多定位源的共同影响,使得定位结果越来越复杂。为了克服这些定位的困难,你需要定义一种定位模型。这个模型包括什么时候开始和停止监听定位结果以及何时缓存定位数据;

获取用户定位结果的流程:

1.开启应用程序;

2.过一会,使用既定的定位方式接收定位结果;

3.过滤掉新的但是不准确的定位点,维持一种“当前最佳估计点”

4.停止监听定位更新;

5.充分利用最新的“最佳估计点”

下图形象的说明了随着时间的变化定位的更新以及事件的变化

a4c26d1e5885305701be709a3d33442f.png

这种基于window-during的模型在接收定位数据的时候,可以帮助你决定在什么时候添加定位服务应用。

监听定位结果时间的决策:

你可能想象着在开启应用程序时就开启定位服务,或者当activtity启动时就开始定位。但是长时间用window监听定位结果是需要消耗大量的电量的,然而短时间的定位却提供不了那么高的精确性。

就像上面的例子,你可以通过调用requestLoationUpdates()来开启定位监听;

StringlocationProvider=LocationManager.NETWORK_PROVIDER;// Or, use GPS location data:// String locationProvider = LocationManager.GPS_PROVIDER;locationManager.requestLocationUpdates(locationProvider,0,0,locationListener);

对于新获取的结果一种快速的修正方法:

第一次定位是需要消耗大量的时间的,这对于用户的体验来说是非常不好的。你应该使用一种叫getLastKnownLocation(SString)的缓存机制直到获取到许多精确的定位结果提供给你的定位监听器。

StringlocationProvider=LocationManager.NETWORK_PROVIDER;// Or use LocationManager.GPS_PROVIDERLocationlastKnownLocation=locationManager.getLastKnownLocation(locationProvider);

停止监听数据的决策:

理论上决定什么时候新的定位数据将不再被需要很大程度上取决你程序的复杂程度。区分出什么时候需要定位和什么时候定位数据被使用是可以提高定位估计结果的精确度的。永远都要清楚的意识到长时间的监听会消耗大量的电量,所以一旦你得到了需要的信息,你应该调用removeUpdates(PendingIntent)来停止定位监听;

licationManager.removeUpdates(locationListener);

维持“当前最佳的估计点”

你可能认为得到的新数据点越多定位效果就会越准确。然而,定位精确度的变化,太多的新数据点往往都不是最好的点,你在选择定位点时需要基于一定的标准。这些标准当然也会随着用户应用领域的不同而发生相应的变化。

以下几个方法可以让你得到精确的定位结果:

1.检查是否对于以前的估计点有一个显著的更新;

2.检查估计点的与定位点比较是更好了还是更坏了;

3.如果你更信任哪一种定位方法,要检查新位置并确定它的提供者;

下面是一段详细的代码:

privatestaticfinalintTWO_MINUTES=1000*60*2;protectedbooleanisBetterLocation(Locationlocation,LocationcurrentBestLocation){if(currentBestLocation==null){// A new location is always better than no locationreturntrue;}// Check whether the new location fix is newer or olderlongtimeDelta=location.getTime()-currentBestLocation.getTime();booleanisSignificantlyNewer=timeDelta>TWO_MINUTES;booleanisSignificantlyOlder=timeDelta<-TWO_MINUTES;booleanisNewer=timeDelta>0;// If it's been more than two minutes since the current location, use the new location// because the user has likely movedif(isSignificantlyNewer){returntrue;// If the new location is more than two minutes older, it must be worse}elseif(isSignificantlyOlder){returnfalse;}// Check whether the new location fix is more or less accurateintaccuracyDelta=(int)(location.getAccuracy()-currentBestLocation.getAccuracy());booleanisLessAccurate=accuracyDelta>0;booleanisMoreAccurate=accuracyDelta<0;booleanisSignificantlyLessAccurate=accuracyDelta>200;// Check if the old and new location are from the same providerbooleanisFromSameProvider=isSameProvider(location.getProvider(),currentBestLocation.getProvider());// Determine location quality using a combination of timeliness and accuracyif(isMoreAccurate){returntrue;}elseif(isNewer&&!isLessAccurate){returntrue;}elseif(isNewer&&!isSignificantlyLessAccurate&&isFromSameProvider){returntrue;}returnfalse;}privatebooleanisSameProvider(Stringprovider1,Stringprovider2){if(provider1==null){returnprovider2==null;}returnprovider1.equals(provider2);}

调整模型来省电和数据交换:

在测试APP时,你发现修改模型的如下记下几个方面会对你的程序提供一个良好的定位和表现,那么,请参考如下的三个方法:

1.减少屏幕的大小:小窗口意味着与GPS和NETWORK更少的交互,因此节省了电量,但是在最佳定位点的数量上会给你提供相对较小的选择。

2.降低定位结果返回频率:降低定位结果返回频率也会给你提供更持久的电量续航,但是要以牺牲精确度为代价。权衡的方式就是你如何使用你的定位APP。你可以通过上文中requestLocationUpdates()的第二个第三个参数修改频率

3.指定定位提供者:在某些环境下,你就可以不用同时启用两种定位模式。

常用案例:

以下的几个应用模式你都可以用来定位,而且也可以为你的定位应用提供更丰富的应用场景

带有用户-创建标记内容应用:

假如用户分享他们在该地的一些经历,比如在该地有一个餐馆,分享他家的菜肴;又比如在这个地方,发生了一刻骨铭心的值得大家讨论的事。你可以参考图2:

a4c26d1e5885305701be709a3d33442f.png

帮助用户决定到哪里去:

你也想提供一种类似于百度地图的应用告诉用户想去的地方。

那你可以选择如下方法及模型(图3)

1.当获取新的最佳估计点时重新推荐路径;

2.如果用户已经得到了定位结果就停止监听结果;

a4c26d1e5885305701be709a3d33442f.png

提供模拟的定位数据:

在开发应用程序时,你一定会需要测试你的定位模型是否好用,这时你就可以通过模拟器来实现定位结果的测试。有以下三个方法,Eclipse

DDMS  或者模拟器控制台的"geo"命令

1.Window  --  Show View

--Other ---Emulator Control

2.DDMS  这个就不用说了吧。。。

3."geo" 这个属于dos命令了。。自己看看吧,应该都能懂

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值