android手机定位

LocationManager->LocationListener的OnLocationChanged 定位回调无效问题 问题描述 LocationListener的OnLocationChanged不被回调(触发) 问题分析 locationManager.requestLocationUpdates(provider, 3000, 0, locationListener); 中的provider一般都是使用 provider = locationManager.getBestProvider(criteria, true); 获取的,但是这个provider并不是在所有设备上都可用。 解决方式 同时监听多个provid 阅读详情

做移动互联网就不太可能不碰手机端的开发。上周为了项目需要,俺也挽袖子抡胳膊开始写起了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上要想获取定位信息,必须使用异步方式。

代码大概是这个样子:

01locManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);  
02locListener = newLocationListener() {  
03    @Override  
04    publicvoidonStatusChanged(String provider,intstatus,  
05            Bundle extras) {  
06        // TODO Auto-generated method stub  
07    }  
08    @Override  
09    publicvoidonProviderEnabled(String provider) {  
10        // TODO Auto-generated method stub  
11    }  
12    @Override  
13    publicvoidonProviderDisabled(String provider) {  
14        // TODO Auto-generated method stub  
15    }  
16    @Override  
17    publicvoidonLocationChanged(Location location) {  
18        // TODO Auto-generated method stub  
19        mobileLocation = location;  
20    }  
21};  
22locManager.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平台最后一次获取到的位置信息。比如,你可以这样:

  1. 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 onLocationChanged Demo 简单实现只根据GPS卫星得到数据。 package hymost.android.cit;import android.annotation.Nullable; import android.app.Activity; import android.location.Location; import android.location.LocationListener; import android. 阅读详情

相关推荐

Android 原生定位开发(解决个别手机定位失败问题)

在android开发中地图和定位是很多软件不可或缺的内容,这些特色功能也给人们带来了很多方便。定位一般分为三种发方案:即GPS定位、Google网络定位以及基站定位。本文分别介绍GPS定位、以及基于Google的网络Wifi定位的详细步骤,(小米手机获取位置信息locationManager.getLastKnownLocation(provider)的Location一直为空,查了资料换了种获取手机getProviders的方式就可以了)

weixin_37587365的博客 4778

不简单的手机定位

<br />做移动互联网就不太可能不碰手机端的开发。上周为了项目需要,俺也挽袖子抡胳膊开始写起了android程序,还好有java基础,倒也上手快,写了几个小程序,主要都是关于定位方面的。<br /> 网上也搜得到一些相关的文章和教程,但给出的例子效果不太好,而且感觉只有其表,却不明其理。因此写出此文,分享一些我的经验。虽然是以android为主,但是我想对其它平台的开发也应该有些帮助。<br />这篇文章侧重于制定一个合理的定位方案。<br /> <br />手机定位的方式<br /> 先科普一些基础

智障大师 的专栏 7万+

Android开发之手机定位

手机定位基于以下三种方式:

Andyの笔记 3433

对于locationprovider中的onLocationChanged不执行的分析

最近一直苦恼的一个问题,在开发中经常会用到定位,我们可以使用locationprovider来获取位置的经纬度,但是有个问题,有的手机能获取到位置信息,有的手机不能获取,主要原因可能是有的手机使用的是goole的位置服务,大家都知道现在google的服务在这是不能使用的,所以这些使用google的位置服务的手机不能获取位置信息。

niulijieniu的专栏 4467

手机定位(原生android定位)

手机的定位分为卫星定位和网络定位两大类;卫星定位:它服务由几个全球卫星导航系统提供,主要包括美国的GPS,中国北斗等,它是根据多颗卫星与导航芯片的通信结果得到手机与卫星距离,然后计算手机当前所处的经度,纬度以及海拔高度,使用卫星定位需要开启手机上的GPS功能,(最好在室外使用)网络定位:网络定位有基站定位和wifi定位两个子类,手机插入sim卡会搜索周围基站信号并接入通讯服务,(手机基站俗称铁塔)...

wk_先森的博客 6639

VM虚拟机下,通过无线,有线两种方式连接PLC的设置方法

1,VMware软件:编辑>虚拟网络编辑器。 2.右下角:更改设置(如果可以选中“添加网络”选项,则可考虑略过此步) 3.选中VMnet0,点击桥接模式,选中你的物理机有线网卡。点击确定。 4.点击添加网络,我的添加完是VMnet2,然后选中,像上一步样,点击桥接模式,在下拉菜单中选中笔记本的【无线网卡】,然后点击确定。 5.VMware软件:虚拟机>设置。 6.点击 添加>网络...

weixin_46441715的博客 2万+

android 3g 定位,安卓手机如何给GPS加速定位

核心提示:本教程为大家介绍如何使用安卓手机给GPS加速定位。当你的手机已Root了,而且需要装有类似RE管理器之类的工具。打开RE管理器,进入目录/system/etc,找到文件"gps.conf"在RE管理器的右上角点击"挂载为读/写"长按文件"gps.conf",选择"用文本编辑器打开"分为两类型用户分别替换成如下:电信2G或3G完美使用版配置:NTP_SERVER=cn.pool.ntp.o...

weixin_39558391的博客 222

【阿里云大模型高级工程师ACP习题集】2.9 大模型应用生产实践(下篇)

【摘要】这是我精心整理出对应的习题集,里面足足有 30 道题目,从基础概念到深度拓展,全方位覆盖章节重点、难点。不管你是想检验自己的学习成果,还是想针对薄弱环节进行强化训练,它都能完美适配!

davidkorhenn的博客 2237

android 手机 基站定位软件,安卓手机基站+GPS定位源码

这是安卓手机基站+GPS定位源码下载,androidGPS及WIFI基站定位坐标源码,经典Android源码资料,独家提供,欢迎下载!!!软件介绍package com.maxtech.common.gps; import com.maxtech.common.gps.GpsTask.GpsData; public interface GpsTaskCallBack { public void g...

weixin_42501904的博客 2741

MACS2软件进行Peak calling

MACS2可以检出ChIP-Seq,ATAC-seq 以及 MeRIP-seq (RNA甲基化测序) 等富集的序列。peaks calling 有不同的方法,MACS2是最常用的call peaks工具。 MACS全称Model-based Analysis of ChIP-Seq,最初的设计是用来鉴定转录因子的结合位点,但是它也可以用于其他类型的富集方式测序。usage: macs2 [-h] [--version] {callpeak,bdgpeakcall,bdgbroadca

qq_27390023的博客 3789

C#实战:如何用Bartender 10.1实现动态打印与批量打印(附完整源码)

本文深入探讨了如何在C#项目中高效集成Bartender 10.1,实现企业级的动态打印与批量打印功能。文章提供了从环境配置、COM接口精讲、高可用打印服务类封装,到批量打印性能优化及生产环境部署的全套实战方案与源码,帮助开发者构建健壮、可维护的打印解决方案。

weixin_29290963的博客 435

如何在安卓手机上设置虚假的GPS定位

将安卓手机设备上的 GPS 位置更改为虚假位置的原因有很多,例如测试基于位置的应用程序、隐私问题或访问受区域限制的内容。

xiaonianzuibang的博客 2万+

YOLO11改进|注意力机制篇|引入先验卷积注意力机制CPCA

YOLO11中添加先验卷积注意力机制CAPA

A1983Z的博客 2375

苹果手机开启定位 安卓手机开启定位 小程序打开定位步骤

1、点击手机里面的设置,进入设置页面找到【隐私与安全性】2、点击进入隐私与安全性页面,找到【定位服务】3、点击进入定位服务页面,找到【定位服务】,查看是否开启,没开启的话开启4、点击进入位置提醒页面,开启【在位置提醒中显示地图】5、找到【微信】,点击进入开启【精准位置】

vip_mcgrady的博客 2552

Transformer 在自动驾驶中的应用:深度对比特斯拉(Tesla)、小鹏(XNet)、华为(ADS 2.0)在 Transformer 架构应用上的异同

自动驾驶汽车是当前人工智能和机器学习领域的热点研究方向之一。其核心技术之一就是基于深度学习的感知和决策系统。在感知系统中,目标检测和跟踪、语义分割、场景理解等计算机视觉任务至关重要。而在决策系统中,规划和控制模块需要对当前状态进行建模并做出相应的决策。近年来,Transformer模型在自然语言处理领域取得了突破性进展,并逐步被应用到计算机视觉等其他领域。相比于传统的卷积神经网络和循环神经网络,Transformer模型具有建模长距离依赖关系的能力,可以更好地捕捉输入序列中的全局信息。

AI天才研究院 864

PCL CSF布料模拟算法【2026最新版】

CSF布料模拟地面滤波算法的PCL实现,博客长期更新,本文最近更新时间为:2026年10月26日。

点云侠的博客 3917

Android手机定位

当前越来越多的安卓应用开始使用基于LBS的服务来完善用户体验。术语LBS(Location Based Service)可以称为基于位置信息的服务,使用百度地图或google地图进行开发的应用程序不可避免的要使用到定位功能。

feihaixin的专栏 1323

Dify使用教程3:Dify创建工作流

Dify使用教程3:Dify创建工作流 接着,我们连接下一个节点:“LLM”填入上下文变量为:result。这时候知识库就添加成功了。添加新节点:结束节点。

拥抱具身智能,昇腾Ascend C 5129

android如何增加北斗定位,安卓手机怎么设置北斗导航图文教程

原标题:安卓手机怎么设置北斗导航图文教程您知道如何在安卓手机上设置北斗导航吗?今天,我们将看看如何将北斗导航支持添加到安卓手机。实际上,该方法非常简单。您只需要添加一个应用程序并打开手机功能定位,即可在安卓手机上设置北斗导航功能。1.打开移动界面,找到应用程序市场图标。 2.在应用程序市场中找到“ AndroiTS GPS Test Pro”软件,然后下载并安装。 3.在手机中找到设置按钮。 4....

weixin_39819661的博客 6267

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android开启手机gps定位,如何让安卓手机GPS定位加速

打开RE管理器,进入目录/system/etc,找到文件"gps。conf"在RE管理器的右上角点击"挂载为读/写"长按文件"gps。conf",选择"用文本编辑器打开"分为两类型用户分别替换成如下:【电信2G或3G完美使用版配置】:NTP_SERVER=cn。pool。ntp。orgXTRA_SERVER_1=http://xtra2。gpsonextra。net/xtra。binXTRA_SE...

weixin_29254673的博客 752

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

手机基站定位(安卓手机定位源码)

下面是手机基站定位代码:public class CellIDInfo { public int cellId; public String mobileCountryCode; public String mobileNetworkCode; public int locationAreaCode; public String r...

weixin_30889885的博客 1648

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

uniapp手机定位或者uniapp结合原生安卓定位

前端回调 // 获取当前位置 getPosition: function() { _self.GetLocation(function(res) { if (res) { _self.longitude = res.longitude;// 经度 _self.latitude = res.latitude;//纬度 _self.address = res.address;//五级地址 } }) }, 方法封装 GetLocation:function(ca

aj951225的博客 4245

android中手机定位

先说说生活中主要用的定位方式1.网络定位:根据ip地址定位ip地址和实际地址形成一个数据库(纯真ip数据库),可以根据ip在数据库中查出具体地址,警方使用此方法破案 缺点:ip地址动态分配会导致不准确2.基站定位三个基站,能确定一点,所以在城市较好定位 范围:几百米到几公里不等,范围比较广3.GPS定位,美国的卫星定位至少需要三颗卫星 GPS使用24颗卫星,基本可以覆盖全球90%地区 范围:

haowei0708的博客 502
上一篇: 关于泛型类---default关键字
下一篇: Android 中设置应用程序安装位置
myshapozi
博客等级 码龄16年 4粉丝 18原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值