- 相关推荐
安卓手机GPS定位慢不定位解决方法
手机刷了新版rom后,发现gps定位极其困难,有时甚至只能在wifi环境下才能成功搜星定位。其实究其原因,是因为很多新版rom并非面向亚洲地区发行的官方版rom,但是你只需打上这个gps定位补丁即可解决问题。
软件名称:android版gps定位补丁
文件格式:conf
支持平台:android
一、首先,你需要给你的安卓手机装上文件管理器root explorer,也就是高手口中常说的“r.e管理器”【r.e管理器点击下载】。它可以获取系统的最高权限,以便对手机系统文件进行编辑和修改。而它的使用方法也很简单,类似于pc端的“我的电脑”,
二、用rootexplorer进入并打开“/etc/http://www.oh100.comnf”文件,重点观察一下“ntp_server”那一行,其等号后边清晰注明了“north-america”(北美),这就是问题的关键。这说明在我们新刷入的rom中,gps网络指向了北美洲,所以才会出现定位缓慢甚至无法定位的问题。
三、知道问题就好办了,请出要用到的主角 gps定位补丁。【rgps定位补丁点击下载】下载并解压后,将“http://www.oh100.comnf”拷贝至手机sd卡根目录;再次进入rootexplorer,复制该文件并分别覆盖“/etc/”以及“/system/etc/”这两个路径下的同名文件即可成功搞定。
Android 手-机-定-位慢的解决方法2017-03-22 21:03 | #2楼
影响手-机-定-位速度的因素有很多,包括所处室内外环境、网络状态等。但这些都是外在因素,是相对比较容易改变的。其实影响手-机-定-位速度的还有一个内在因素,就是手机最基本的定位方式—gps定位所使用的ntp服务器。经查看,发现很多国内的手机所使用的ntp服务器是北美的服务器,连接速度很慢甚至连接不上,自然影响手-机-定-位。解决这一内在问题的方法也比较简单,就是修改使用访问速度较快的国内的ntp服务器,具体为修改手机/etc/http://www.oh100.comnf文件里的配置信息,例如使用http://www.oh100.com等。
另转一篇使用android定位方式等文章:http://www.oh100.com
做移动互联网就不太可能不碰手机端的开发。上周为了项目需要,俺也挽袖子抡胳膊开始写起了android程序,还好有java基础,倒也上手快,写了几个小程序,主要都是关于定位方面的。
网上也搜得到一些相关的文章和教程,但给出的例子效果不太好,而且感觉只有其表,却不明其理。因此写出此文,分享一些我的经验。虽然是以android为主,但是我想对其它平台的开发也应该有些帮助。这篇文章侧重于制定一个合理的定位方案。
手-机-定-位的方式
先科普一些基础知识吧。
最简单的手机定 位方式当然是通过gps模块(现在大部分的智能机应该都有了)。gps方式准确度是最高的,但是它的缺点也非常明显:1,比较耗电;2,绝大部分用户默认 不开启gps模块;3,从gps模块启动到获取第一次定位数据,可能需要比较长的时间;4,室内几乎无法使用。这其中,缺点2,3都是比较致命的。需要指 出的是,gps走的是卫星通信的通道,在没有网络连接的情况下也能用。
另外一种常见的定位方式是基站定位。大致思路就是采集到手机上的基站id号(cellid)和其它的一些信息(mnc,mcc,lac等等),然后通过网络访问一些定位服务,获取并返回对应的经纬度坐标。基站定位的精确度不如gps,但好处是能够在室内用,只要网络通畅就行。
还有wifi定位。和基站定位类似,这种方式是通过获取当前所用的wifi的一些信息,然后访问网络上的定位服务以获得经纬度坐标。因为它和基站定位其实都需要使用网络,所以在android也统称为network方式。
最后需要解释一点的是agps方式。很多人将它和基站定位混为一谈,但其实agps的本质仍然是gps,只是它会使用基站信息对获取gps进行辅助,然后还能对获取到的gps结果进行修正,所以agps要比传统的gps更快,准确度略高。
android提供的定位接口
在写第一个程序之前,我对android的幻想是这样的:提供了一个函数,能够让我直接从gps模块中读取经纬度坐标,还有一个函数,能够直接访问网络,获得基站定位的结果。所以,我只需要调用调用函数就可以搞定这一切。
现实和理想总是有很大的差距。android上的开发完全不是这么回事儿。前面提到过,gps模块从启动到获取数据之间时间会比较长,可能有2~3分钟时间,所以,如果真有这么一个函数,那么你的程序可能会被这个函数阻塞几分钟。我想正是基于这样的考虑,android上要想获取定位信息,必须使用异步方式。
《安卓手机GPS定位慢不定位解决方法》全文内容当前网页未完全显示,剩余内容请访问下一页查看。
代码大概是这个样子:
locmanager.requestlocationupdates(locationmanager.gps_provider,0,0, loclistener);这是从网上随便摘一段。简单解释一下代码:
首先,你需要创建一个locationmanager;
然后定义出自己的locationlistener,locationlistener包涵了好几个成员函数,它们都是回调函数。最重要的一个是“onlocationchanged”,这个函数是在android获取了新的location信息之后调用的,你可以在这个函数内来实现自己想要的功能。比如,你可以定义一个内部location变量,一旦这个函数被调用,就将内部location变量设置成最新的值;
最后,调用locationmanager.requestlocastionupdates,它其实是将定义的locationlistener注册到android中。在上面的代码中,这句话是说让locationlistener监听gps_provider的变化。gps_provider对应于android上的gps模块获取位置信息,还有一个network_provider表示通过network方式获取位置信息。
问题
那么接下来就有问题了,什么时候能够真正获得手机的 定位经纬度呢?等着onlocationchanged被调用吧。那它什么时候会被调用?没人知道。我写过一个小程序,测试network方式下注册过 listener之后(requestlocationupdates函数)和onlocationchanged被调用之间的时间间隔。测试的网络条件 很好。反复观察了几次,大部分都可以在几十毫秒内就返回了,但也有一些时候,时间间隔长达几十秒。这意味着,你的用户需要等上几十秒才能有返回。
所以,第一个需要注意的地方是,不要一直等待你的回调函数onlocationchanged被调用。你需要设置一个timeout机制。
这又会引入第二个问题。如果timeout了,但onlocationchanged仍然没有返回,怎么办?难道只能提示用户无法定位吗?
别急,android还提供了一个函数:getlastknowlocation。这个函数会返回android平台最后一次获取到的位置信息。比如,你可以这样:
location lastknownlocation = locationmanager.getlastknownlocation(locationmanager.gps_provider);所以,即便onlocationchanged没有被调用,我们仍然可以获取一个位置信息。当然,这里又引出了第三个问题:这个的返回值值得信赖吗?
如果用过一些lbs或者地图程序,你会发现有一个现象:在某些时候你打开地图结果被定位到的地方是你上一次使用地图程序的位置。这就是因为程序是采 用getlastknownlocation获取的位置。这个问题的解决办法是,需要定义一个标准判断获取到的location是否可信。android的location这个类除了包涵有latitude,longitude,还包含有很多其他的信息,比如何时获取到的,通过哪种方式获取到的,等等。程序员完全可以基于这些信息来判断获取到的location是否过时或者是否可信。
合理的方案
最后,说一下整体方案。android的官方文档【1】给出了推荐的方案:
首先注册自己的locationlistener,让它同时监听gps_provider和network_provider;
然后可以调用getlastknownlocation获得一个location值,这个值可以作为一个备选值;
然后在一段用户可接受的时间内,不断接收从onlocationchanged返回的位置,并同之前的值做比较,选取其中的最佳;
最后,会剩下一个筛选后的最优结果,你需要判断这个结果是否可接受。如果可以接受,返回给用户,如果不行,告诉用户无法定位。
整个过程你需要定义两个重要的函数:一个是比较两个location信息,返回其中好的那个;另一个函数则用来判断location信息是否可以被接受。
【安卓手机GPS定位慢不定位解决方法】相关文章:
gps定位监控值班制度04-22
工作定位面试回答04-18
市场定位与营销策略05-18
职场的定位标准11-21
确定位置教案11-26
管理者的职能定位04-16
管理者的自我定位04-16
管理者的职责定位04-16
人员定位系统值班制度04-17
三严三实定位05-07