《AndroidGPS定位总结.docx》由会员分享,可在线阅读,更多相关《AndroidGPS定位总结.docx(21页珍藏版)》请在优知文库上搜索。
1、前儿天接了一个关于Android的小项目,虽然对于安卓还是一窍不通,不过还是接下来打算以此为动力起先H学。花了两天左右的时间始终在看传智播客关于Android的视频,了解了一些基本学问,就起先对需求分析着手起先谷歌百度查资料的过程。需求分析要求在安卓端实现对手机的即时监控,每隔肯定时间将当前手机的信息(主要是经纬度信息)发送到服务器,并且要求该程序必需在开机时启动,通过后台服务依据不同的时间段发送。然后在PC端可以通过登入认证调用该手机的运行轨迹,以达到对手机进行监控的目的。刚接到这个需求时感觉实现起来应当很简洁,就在开过一些基础的视频以后询问/下白哥和戚老师相关的技术问题,就起先各种看源代码
2、,第个想法就是先从连接服务器起先做起,参考了b-GoogleAndroid这本书中的例子,把将相应的代码截取出来,写了个小程序进行测试。开了android模拟器和tomcat,然后通过模拟器访问tomcat里面的测试工程,结果连接失败了。由于是本地连接,所以ip地址就写了192.168.1.1,结果怎么也连不上,后来白哥了卜才发觉,andriod模拟器访问本地工程的时候ip地址应当写10.0.2.2,于是也就连上了。然后就是GPS定位,去网上找了代码在模拟器上无法定位,始终是获得不到location,我想可能会不会是模拟器的事情,然后申请了台安卓测试机,天翼N760,用过之后才发觉信号那是相当
3、的差。也是获得不到经纬度。然后就去网上查了关于定位的资料。r解到定位的方式分为基站、WIFl和GPS,GPS定位比较精确但是定位速度比较慢,前两者则定位忖间相对快一些,但是精度就差几千米试/各种定位方法仍旧是找不到1。Cation,然后就想到了通过ip来定位的方法,首先是用模拟器测试,通过安卓端获得本地ip然后经由ip地址查找当前机器所在位置,这个在模拟器端获得的IP查到的经纬度偏差太大,但是真机测试的时候误差相对较小,不过也只能精确到市和区的级别,及此同时,这种做法我是通过谷歌地图检测的地理位置,通过网上的IP归属地测试找到的经纬度坐标,此间可能存在偏差,不过这种思路不久也OUT想几天想不明
4、白就去问了王晓峰老师,用他的三星手机测试了卜.,最终将代码中的gps定位方式换成network定位就好使(,而且定位速度那个快啊,秒钟就定位了。得到的阅历就是起先定位的时候GpS那个标记是闪闪的,等不闪就定位胜利/.还以为定位问题就这样解决了,就copy了卜.那个可以定位的代码回去测试,可是天翼那个还是找不到localion,于是就归咎于天翼手机型号的问题。可是细致想了卜.,为什么手机里自带的地图定位服务可以用?询问了一个搞通讯的挚友,说可能是安卓版木不同接口存在不同的问题,听到这里突然想到晓峰老师的手机是Andriod2.2的,天翼那台是2.3.4的,版本的确不相同,然后就找不同版本接口的差
5、异,没有结果,只是说GOogIeaPi和Android有肯定的不同,因此这个想法也就短暂放弃广。开QQ找了一个搞八ndriod开发的挚友,给我发了个他以前写过可以实现定位功能的程序,结果这个程序跟我的特别相像,也获得不到】。CaIiOn。对于定位问题的解决一筹莫展.大约第六天,阅读了海量相关帖子以后,发觉定位方式可以不仅限于google的定位,网上还供应了百度定位和腾讯定位,也有人供应了相应的定位插件。刚起先打算用别人供应的个叫引路蜂的插件,没下到源代码,就起先鼓捣百度定位。结果定位问题解决了,误差大约1千米,就意味着定位能精确到街了,及之前不同的是,这次定位可以看到定位标记的闪动,也就是说之
6、前的定位程序根木就没有及卫星连接。定位问题短暂这样解决了。接下来就测试一下将经纬度发送到测试项目吧,开启了电脑的tomcat服务器,查询了本机的ip起先连接,结果连接不上了,询问了一下,说由于本地ip不固定,并且我这台电脑处于一个局域网中,尽管局域网中用的是个路由器,不过仍IU不能被访问。这个使我想起来了以前白哥说的为J保证数据库的平安一般数据库是不放到服务器上的,而是经由服务器访问相应的局域网电脑,实现数据库的平安访问。于是我就申请了一个服务器,在服务器上安装rOracle和tomcal,就连接上了。当看到tomcat里面显示动身送的信息时,我感觉发送问题就这样解决于是接着考虑google定
7、位的问题,又起先百度,结果发觉一个很关键的问题,那个1.OCalionlocation=IocationManager.get1.astKnown1.ocation(provider)方法由于是获得最近一次的定位数据,也就是说没定位过手机是不会存在近期数据的,这也是导致location获得不到的缘由,并且在不能刚好定位的状况卜.,该方法获得到的定位信息时过时的,也就是说假如我三个小时之前定过位,然后这三个小时中无法获得定位信息,则返回的始终是三个小时前的信息,因此会导致数据的不正确行,然而这个方法也有自己的优点,就是可以特别快速的显示自己的经纬度,还有一个值得思索的问题就是在没有确定晓峰老师的
8、手机之前有没有定位,假如没有的话,那么两种型号不同的手机采纳同样定位方式可是结果不同就值得去思索了。最终杳了相关资料,发觉1.ocalIon1.islener的On1.OCalionChanged方法完全可以获得当前的IoCation信息,并经由该方法就可以获得经纬度信息,我设定了移动范围为10米,定位间隔为1秒,在室外测试,走几步就会变更一次经纬度,谷歌地图测试了卜.,已经精确到平方区了,用高德地图查了卜误差大约在IO米左右。在此想到了百度地图的定位结果,不解除google和百度获得的经纬度有肯定偏差的问题。不过定位的精度也就够了吧。然后就是后台服务和开机启动的问题,开机启动没什么压力,主要
9、是后台服务的时候出现了问题,也是第次接触SerViCe,对于服务的划分也不清晰,做完后台服务以后,测试一下吧。结果在打开应用程序的时候切执行正常,关闭activity然后相应的service也就不执行九但是通过查看正在运行的应用程序可以发觉,这个程序仍旧处在运行之中。后来去网上查了信息,劝服务也分为本地服务和远程服务,木地服务必需依附于主线程,而远程服务则可以供应多线程之间的共享,般是些常驻程序。后来我就在SeViCe方法中通过handle调用线程来眼制消息的发送,这样就解决了后台持续发送信息到服务器的问题。接下来就是这次项目的测试版代码,由于时间问题短的只停留在实现的层面上,对于安卓的框架支
10、持有待挖掘.也由于该项目涉及一些隐私问题,所以贴出基木功能实现代码。对于程序技术上的问题存在可修改的地方,欢迎沟通。QQ:327229983google定位代码packagecom.javenwong.google_gps;importandroid,app.Activity;importandroid,content.Context;importandroid,content.Intent;importandroid.location.Criteria;importandroid.location.1.ocation;importandroid.location.1.ocalion1.ist
11、ener;importandroid,location.1.ocationManager;importandroid,os.Bundle;importandroid,widget.TextView;importandroid,widget.Toast;publicclassGoog1e_gpsActivityextendsActivity(TextViewtvl:*Calledwhentheactivityisfirstcreated.*/OverridepublicvoidOnCreate(BundleSavedInstanceState)super.OnCreate(SavedInstan
12、ceState):setConlentView(R.layout,main):Intenti=newIntent(this,ServiceTest.class);i.SeIFlagS(Inlenl.F1.AG_ACTIVITYNEWTASK);StartService(i);tvl(TextView)this.findViewBy!d(R.id.tvl);Ip=CetHostIpO;/tvl.setText(ip);/openGStringPSSetlingsO:/*(IPget1.ocation()/获得位置管理服1.og.i(hell。”,is+ip);/get1.ocation():/t
13、vl.setText(ip);tvl.setText(*hello”);)privatevoidOpenGPSSettingsO1.ocationManageralm=(1.ocationManager)this.getSystemService(Context.1.OifCATION_SERVICE);(alm.iSProviderEnabled(android.1ocalion.1.ocalionManager.NETWORK_PROVIDER)Toast.makeText(this,Net模块正常”,Toast,lengtlshort).showO:return;Toast.makeTe
14、xt(this,”请开启GPS!”,Toast.1.ENGTH_SHORT).showO;/Intentintent=newIntent(Seltings.ACTION_SECURITY_SETTINGS);/startActivityForResult(intent,O);此为设置完成后返回到获得界面privatevoid务1.ocatIonManagerIocationManager;StringServiceName=Context.1.OCAT10N_SERVICE;IocationManager=(1.ocationManager)this.getSystemService(serv
15、iceName);/查找到服务信息Criteriacriteria=newCriteriaO;criteria.SetAccuracy(Criteria.ACCURCY_FINE);高精度criteria.setlIitudeRequirecKfalse);criteria.SetBearingReqUired(false);criteria.SetCostAllowed(true);criteria.setPowerRequirement(Criteria.POWER_1.OW);/低功耗StringproviderIocationManager.getBestProvider(criteria,true);/获得GPS信息Toast.makeText(this,“请开启123!+provider,Toast.1.ENGTH_SHORT).showO;/设置监听器,自幼更新的最小时间为间隔N秒(1秒为1*1000,这样写主要为了便利)或最小位移变更超过N米IocationManager.requesI1.ocaliOnUpdales(1.ocalionManager.GPS_PROVIDER,2000,10,new1.ocation1.istenerOI0Verridep