Android之GPS定位详解
安卓(Android)全球定位(GPS)浅层调优原理及其方法
要弄明白i9000的GPS、AGPS,最好先要对GPS相关一些概念有些了解。
:关于GPS,AGPS,SUPL XTRA,星历;冷启动、暖启动、热启动等,各位可以先百度一下,有个了解,概念如果清楚了,那么请注意:一、I9000的GPS操作模式中的MS base 模式:(接受GPS基站导航信息由手机计算并定位),MS assisted模式(定位信息由手机基站计算后发给手机定位),此两种模式为真正的AGPS模式,SUPL也是通过MS BASE 模式实现的,此服务可能需手机运营商支持才行,我的手机是移动G网的,选了此两种模式均没有任何流量产生,在NMEA输出语句也未见$GPCELL或$SUPL语句,定位效果也未见加快,因此可以说I9000 的SUPl AGPS是没有用的。
哪位兄弟用联通或者3G的试试,如果能打开I9000的SUPL AGPS,那也是I9000的福音了。
二、I9000的AGPS不是真正联机在线的AGPS,而是离线式的APGS,即XTRA模式(I9000中所谓的GPS-PLUS模式),类似于AGPS功能,在GPS没搜到卫星之前,先利用网络下载星历数据,然后通过星历数据就能够很快找到可使用的卫星,从而提高搜星速度。
打开R.E管理器,进入\data\GPS 目录,正常设定后会有如下5个文件,此5个文件可以删除的,联网打开GPS后文件都会更新的:1、gldata.sto此文件是GPS Location(GPS定位)数据,这是GPS芯片从GPS卫星上得到的数据,不联网只开GPS时,数据一颗一颗接受较慢,联网后较快,此文件长度会有变化,数据离当前越近,长度越长,则定位越快。
2、lbsdata.sto此文件是位置服务数据,由GPS 测试工程模式(LBS测试模式)产生,此文件可有可无。
3、lto.data此文件即为下载的XTRA 星历数据,I9000快速定位,主要依靠此数据,数据离当前越近,定位越快。
(此数据也可用GPS软件GPS_STATUS 更新)。
安卓手机怎么定位
安卓手机怎么定位在现代社会的信息时代,定位功能成为了智能手机中一个非常重要的功能之一。
利用定位功能,我们可以随时随地知道自己所处的位置,找到自己的目的地。
本文将为大家介绍安卓手机的定位功能以及如何使用它。
安卓手机具有内置的GPS(全球定位系统)功能,通过与卫星的通信,可以精确地确定手机和用户的位置。
在定位服务打开的情况下,安卓手机可以通过GPS、蜂窝数据和Wi-Fi联网等方式,获取用户的位置信息。
要开启安卓手机的定位功能,我们可以按照以下步骤进行操作:1. 打开手机的设置应用程序。
2. 滑动屏幕并找到“位置”或“定位”选项。
3. 点击“位置”或“定位”选项,进入位置设置页面。
4. 在位置设置页面中,确认开启“定位服务”开关。
一旦开启了定位功能,我们就可以通过多种方式进行定位。
第一种方式是使用安卓手机自带的地图应用程序。
大多数安卓手机都预装了Google Maps应用程序,该应用程序不仅可以提供详细的地图信息,还可以使用GPS定位功能。
通过Google Maps,我们可以在地图上标记自己的位置,并获取详细的导航路线。
第二种方式是使用第三方的定位应用程序。
在Google Play商店中,有许多免费和付费的定位应用程序可供选择。
这些应用程序提供了不同的定位功能和使用界面,可以根据自己的需求选择合适的应用程序进行定位。
除了地图应用程序和定位应用程序外,安卓手机还可以根据用户的需求,通过其他应用程序进行定位。
例如,在社交媒体应用程序中,我们可以使用定位功能与朋友共享自己的位置。
在出行应用程序中,我们可以使用定位功能查找附近的餐厅、酒店和商店等。
安卓手机的定位功能不仅可以用于个人使用,还可以用于商业和应急领域。
例如,在某些商业应用场景中,可以通过安卓手机的定位功能对物品进行追踪和管理。
在紧急情况下,安卓手机的定位功能可以被用来定位受困人员的位置,以便进行救援。
定位功能的应用范围越来越广泛,给人们的生活和工作带来了许多便利。
基于Android系统智能手机的GPS定位功能的设计与实现
基于Android系统智能手机的GPS定位功能的设计与实
现
在基于Android系统智能手机的GPS定位功能的设计与实现时,需要考虑以下几个方面。
1. 确定需求和功能:明确应用的定位需求和功能,例如地图定位、导航、行车记录和位置共享等,以确定需要使用何种GPS定位
服务和相关API。
2. 获取定位权限:在Android系统中,需要申请定位权限才能
使用GPS定位服务。
可以在应用中使用系统提供的API或者在清单
文件中声明权限来获取定位权限。
3. 调用系统定位服务:在使用GPS定位服务时,可以通过系统
提供的LocationManager类来获得Location对象,并获取定位信息。
4. 实现定位功能:在获得定位信息后,可以将其在应用中进行
处理,例如在地图上展示当前位置、提供导航指引等。
可以使用第
三方地图SDK来实现这些功能。
5. 处理定位异常:在使用GPS定位时,可能会出现一些异常情况,例如定位时间过长、定位数据不准确等。
需要进行异常处理,
保证应用的稳定性和准确性。
总体来说,在基于Android系统智能手机的GPS定位功能的设
计与实现时,需要详细了解系统提供的GPS定位服务和相关API,
根据需求和功能进行适当的选择和配置,并进行异常处理和优化,
以便实现高效、稳定和准确的定位功能。
android手机定位
android手机定位做移动互联网就不太可能不碰手机端的开发。
上周为了项目需要,俺也挽袖子抡胳膊开始写起了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定位原理
android定位原理Android定位原理是指利用Android设备内置的各种定位技术和传感器来获取用户的地理位置信息。
Android设备通常会使用GPS(Global Positioning System)、网络定位和传感器融合定位等技术来实现定位功能。
GPS定位是指利用卫星信号来确定设备的精确地理位置。
Android设备通过内置的GPS芯片接收卫星信号,然后利用三角测量原理计算出设备的经纬度坐标。
GPS定位的优点是精确度高,可用于室外环境。
然而,GPS信号在室内、高楼群等环境下可能受到干扰,定位精确度会降低。
网络定位是指通过连接到网络来获取设备的大致地理位置。
Android设备可以使用Wi-Fi、移动网络信号、蓝牙等来进行网络定位。
通过扫描附近的Wi-Fi和移动信号基站,设备可以获取到周围网络设备的位置信息。
由于网络设备通常分布广泛,所以网络定位的精确度相对较低,但在室内和GPS信号较弱的情况下,网络定位仍然可以提供相对准确的位置信息。
传感器融合定位是指将多种传感器的数据进行融合,从而获取更准确的位置信息。
Android设备常用的传感器包括加速度计、陀螺仪、磁力计等。
通过分析这些传感器的数据,可以获得设备的加速度、方向、旋转等信息,从而推算出设备的运动轨迹和姿态变化。
传感器融合定位结合了GPS和网络定位的优点,可以在各种环境下提供更准确的定位结果。
总结起来,Android定位原理主要包括GPS定位、网络定位和传感器融合定位。
通过使用这些技术,Android设备可以获取用户的地理位置信息,为用户提供定位服务。
Android GPS架构分析-摘自Daniel Wood的博客
以下摘自Daniel Wood的博客:/u4/123238/article_150426.html Android GPS架构分析(gps启动过程图)Gps启动过程图(基于Google Android 2.2代码)Android GPS架构分析-previewAndroid GPS架构分析Daniel Wood 20101222转载时请注明出处和作者文章出处:作者:Daniel Wood----------------------------------------------------------看Android的GPS模块有两个月了吧,终于可以写点东西出来。
首先来看看GPS 模块的代码结构:Framework:1.frameworks/base/location/java/android/location这里主要是用来被App调用的,API包是android.location。
2.frameworks/base/location/java/com/android/internal/location这个目录是Framework对Location服务的内部实现。
3.framework\services\java\com\android\server这个目录只有一个文件|-- LocationManagerService.java是Location服务对内部实现的一种封装。
JNI:frameworks/base/core/jni/android_location_GpsLocationProvider.cppJNI层只有一个文件,起到承上启下的作用。
上层承接Framework,下层调用HAL 层具体硬件抽象实现。
HAL:Hardware Abstract Layer 硬件抽象层hardware\libhardware_legacy\gpshardware\libhardware_legacy\include\hardware_legacy\gps.hHAL层相当于一个linux应用程序接口,通过open,close等操作,操作硬件设备。
Android 实现定位及地理位置解析
昨儿折腾了一天,把Android 手机定位、获取手机当前位置的功能给搞掂了。
这次记下来,不然又忘~~思路很简单,第一步,获取经纬度,第二步,把经纬度转换为地址。
看起来简单,但是实现起来比较郁闷~~获取经纬度可以有很多选择。
我刚开始做时,想着Google最好用,但是写完代码测试下,悲催的逆解析地址总是为空。
代码如下:/**** 由街道信息转换为经纬度* @param address 街道信息* @return 包含经纬度的一个double 数组,{longtitude,latitude}*/public static double[] getLocationInfoByGoogle(String address){//定义一个HttpClient,用于向指定地址发送请求HttpClient client = new DefaultHttpClient();//向指定地址发送Get请求HttpGet hhtpGet = new HttpGet("/maps/api/geocode/json?address="+address+"ka&sensor=fal se");StringBuilder sb = new StringBuilder();try {//获取服务器响应HttpResponse response = client.execute(hhtpGet);HttpEntity entity = response.getEntity();//获取服务器响应的输入流InputStream stream = entity.getContent();int b;//循环读取服务器响应while((b = stream.read()) != -1){sb.append((char)b);}//将服务器返回的字符串转换为JSONObject 对象JSONObject jsonObject = new JSONObject(sb.toString());//从JSONObject 中取出location 属性JSONObject location = jsonObject.getJSONObject("results").getJSONObject("0").getJSONObject("geometry").getJS ONObject("location");//获取经度信息double longtitude = location.getDouble("lng");double latitude = location.getDouble("lat");return new double[]{longtitude,latitude};} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (JSONException e) {e.printStackTrace();}return null;}/*** 根据经纬度获取对应地址,此处的经纬度须使用Google或者高德地图的经纬度;<br> * 若使用百度地图经纬度,须经过百度API接口(BMap.Convertor.transMore(points,2,callback))的转换;* @param longitude 经度* @param latitude 纬度* @return 详细街道地址*/public static String getAddressByGoogle(double longitude,double latitude){//定义一个HttpClient,用于向指定地址发送请求HttpClient client = new DefaultHttpClient();//向指定地址发送Get请求HttpGet hhtpGet = new HttpGet("/maps/api/geocode/json?latlng="+latitude+","+longitude+" &sensor=false®ion=cn");StringBuilder sb = new StringBuilder();try {//获取服务器响应HttpResponse response = client.execute(hhtpGet);HttpEntity entity = response.getEntity();//获取服务器响应的输入流InputStream stream = entity.getContent();int b;//循环读取服务器响应while((b = stream.read()) != -1){sb.append((char)b);}//将服务器返回的字符串转换为JSONObject 对象JSONObject jsonObject = new JSONObject(sb.toString());//从JSONObject 中取出location 属性JSONObject location = jsonObject.getJSONObject("results").getJSONObject("0").getJSONObject("formatted_addres s");return location.toString();} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (JSONException e) {e.printStackTrace();}return null;}这件事的惨痛经历告诉我:一定要有政治觉悟,不然编代码丫多的都不成。
客户端开发教程:学会使用常见的位置定位技术(三)
在当今的移动应用开发领域中,位置定位技术是非常重要的一项技能。
在许多应用中,如社交媒体、导航和餐饮服务等,位置信息的使用都是必不可少的。
本文将介绍一些常见的客户端位置定位技术,并提供一些开发教程,帮助您学会使用这些技术。
一、GPS定位技术GPS定位技术是目前最常见和广泛使用的定位方式之一。
通过使用卫星信号,可以精确地确定设备的位置。
在开发应用时,可以通过调用相应的API接口,获取设备的经纬度信息,并进行相应的处理和展示。
在Android平台上,可以使用Google Play服务库提供的Location API进行GPS定位。
要使用GPS定位技术,首先需要在文件中添加相应的权限声明,以获取位置信息的权限。
然后,可以在应用的代码中,通过调用Location API接口,注册位置监听器,接收位置更新回调,并获取位置信息。
根据需要,还可以展示地图、标记位置等。
二、基站定位技术基站定位技术是一种通过基站信号来确定设备位置的方式。
当设备连接到移动网络时,可以通过获取基站信息来获取设备的大致位置。
基站定位的精度相对较低,一般在几百米到几千米之间。
在Android开发中,可以使用TelephonyManager类来获取基站信息。
通过调用相应的API接口,可以获取到基站的位置信息,并进行处理和展示。
但需要注意的是,基站定位需要设备连接到移动网络,且需要相关的权限声明。
三、Wi-Fi定位技术Wi-Fi定位技术是一种通过Wi-Fi信号来确定设备位置的方式。
与GPS相比,Wi-Fi定位在室内或城市中的信号覆盖更好,定位精度更高。
在开发应用时,可以通过获取设备连接的Wi-Fi热点信息,来推测设备的位置。
在Android平台上,可以使用WifiManager类来获取Wi-Fi信息。
通过调用相应的API接口,可以获取到当前设备连接的Wi-Fi热点信息,包括热点的SSID和信号强度等。
根据这些信息,可以进行相应的处理和展示。
四、混合定位技术混合定位技术是一种结合多种定位方式的定位技术。
有关Android中的AGPS
如上图所示,直接通过 GPS 信号,从 GPS 获取定位所需要的信息,这 是传统 GPS 定位的基本机制。AGPS 中,通过蜂窝基站的辅助来解决或缓解 上文提到的两个问题,对于第一个问题,首次搜星慢的问题,是因为 GPS 卫 星接收器需要进行全频段搜索以寻找 GPS 卫星而导致的。在 AGPS 中,通过 从蜂窝网络(位置服务器)下载当前地区的可用卫星信息(包含当地区可用 的卫星频段、方位、仰角等信息),从而避免了全频段大范围的搜索,使首 次搜星速度得到大大提高,时间由原来的几分钟减小到几秒钟。对于第二个 问题,GPS 卫星信号易受干扰的问题,这是由 GPS 卫星信号本身的性质决定 的,我们无法改变。但是 APGS 中,通过蜂窝基站参考 GPS 的 辅助,或是借 助 GSM 定位中 Cell-ID 定位(COO 定位)方法的辅助,缓解了在 GPS 信号不 良的情况下定位的问题,有效提高了在此情况下的定位精度。
*/ int (*data_conn_open)( const char* apn ); /** * Notifies that the AGPS data connection has been closed. */ int (*data_conn_closed)(); /** * Notifies that a data connection is not available for AGPS. */ int (*data_conn_failed)(); /** * Sets the hostname and port for the AGPS server. */ int (*set_server)( AGpsType type, const char* hostname, int port ); } AgpsInterface;
android 虚拟定位实现原理
android 虚拟定位实现原理
Android虚拟定位的实现原理主要是利用模拟GPS数据,通过模拟器或特
定应用程序来模拟GPS坐标,从而实现虚拟定位的效果。
具体来说,实现虚拟定位的步骤如下:
1. 获取模拟GPS数据:通过模拟器或特定应用程序生成模拟的GPS数据,包括经纬度、高度等信息。
这些数据可以是任意指定的位置,可以根据需要进行设置。
2. 注入模拟GPS数据:将模拟的GPS数据注入到Android系统的GPS服务中。
这通常涉及到修改系统设置或使用特定权限来访问GPS服务。
3. 模拟位置更新:通过定期发送模拟的GPS数据,模拟器或应用程序可以
模拟设备的位置更新。
这使得应用程序和系统服务认为设备正在移动,从而实现虚拟定位的效果。
4. 测试和验证:在完成虚拟定位设置后,需要进行测试和验证,以确保虚拟定位功能正常工作。
这包括检查应用程序是否正确地接收到了虚拟位置信息,以及系统服务是否正确地响应了虚拟位置更新。
需要注意的是,虚拟定位的实现需要具备一定的技术知识和编程能力。
此外,由于涉及到系统级别的修改和权限访问,虚拟定位可能会对设备的稳定性和
安全性产生影响。
因此,在使用虚拟定位功能时,建议谨慎操作并遵循相关法律法规和隐私政策。
客户端开发教程:学会使用常见的地图定位技术(四)
客户端开发教程:学会使用常见的地图定位技术随着智能手机的普及和移动应用的快速发展,地图定位技术在客户端开发中变得越来越重要。
无论是基于地理位置的社交应用、打车软件,还是旅行导航、外送服务,地图定位技术都是不可或缺的一环。
本文将为大家介绍一些常见的地图定位技术,以帮助开发者们更好地使用地图定位功能。
一、使用GPS定位技术GPS(全球定位系统)是最常见的定位技术之一。
利用GPS芯片内置的定位模块,我们可以迅速获取用户的经纬度信息,并将其在地图上显示。
在Android开发中,可以通过Location Manager类获取GPS位置信息。
首先,需要在文件中添加相应的权限,在代码中注册位置监听器,并实现相关回调方法。
通过这种方法,我们可以实现实时跟踪用户的位置,并将其显示在地图上。
但需要注意的是,GPS定位需要用户开启定位服务、在室外环境下才能获得较好的定位精度。
二、利用Wi-Fi定位技术Wi-Fi定位技术是一种无线局域网定位技术,它通过扫描周围的Wi-Fi热点,并将其与预先记录的Wi-Fi信息进行匹配,来确定用户的位置。
相比于GPS定位技术,Wi-Fi定位技术更适用于室内环境和城市区域,在这些环境中,GPS信号相对较弱或不稳定。
在Android开发中,可以利用WifiManager类获取周围可用的Wi-Fi信息,并通过定位算法计算用户的位置。
但需要注意的是,Wi-Fi定位技术的精度相对较低,可能存在一定的误差。
三、使用基站定位技术基站定位技术是利用移动网络基站(电信基站、移动基站、联通基站)的信号强度和延迟等信息来确定用户的位置。
在无法获取GPS信号和Wi-Fi信号的情况下,基站定位技术可以作为一种备选方案。
在Android开发中,可以通过TelephonyManager类获取基站信息,并通过相应的算法计算用户的位置。
但需要注意的是,基站定位技术的精度相对较低,可能存在一定的误差。
四、结合多种技术实现更准确的定位在实际开发中,往往需要结合多种定位技术来获得更准确的定位结果。
Android6.0获取GPS定位和获取位置权限和位置信息的方法
Android6.0获取GPS定位和获取位置权限和位置信息的⽅法1.添加权限--6.0之后要动态获取,下⾯会说<uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION"/>2.直接上代码,不多说,代码中注释很详细。
private static final int BAIDU_READ_PHONE_STATE = 100;//定位权限请求private static final int PRIVATE_CODE = 1315;//开启GPS权限/*** 检测GPS、位置权限是否开启*/public void showGPSContacts() {lm = (LocationManager) this.getSystemService(this.LOCATION_SERVICE);boolean ok = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);if (ok) {//开了定位服务if (Build.VERSION.SDK_INT >= 23) { //判断是否为android6.0系统版本,如果是,需要动态添加权限if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PERMISSION_GRANTED) {// 没有权限,申请权限。
ActivityCompat.requestPermissions(this, LOCATIONGPS,BAIDU_READ_PHONE_STATE);} else {getLocation();//getLocation为定位⽅法}} else {getLocation();//getLocation为定位⽅法}} else {Toast.makeText(this, "系统检测到未开启GPS定位服务,请开启", Toast.LENGTH_SHORT).show();Intent intent = new Intent();intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);startActivityForResult(intent, PRIVATE_CODE);}}/*** 获取具体位置的经纬度*/private void getLocation() {// 获取位置管理服务LocationManager locationManager;String serviceName = Context.LOCATION_SERVICE;locationManager = (LocationManager) this.getSystemService(serviceName);// 查找到服务信息Criteria criteria = new Criteria();criteria.setAccuracy(Criteria.ACCURACY_FINE); // ⾼精度criteria.setAltitudeRequired(false);criteria.setBearingRequired(false);criteria.setCostAllowed(true);criteria.setPowerRequirement(Criteria.POWER_LOW); // 低功耗String provider = locationManager.getBestProvider(criteria, true); // 获取GPS信息/**这段代码不需要深究,是locationManager.getLastKnownLocation(provider)⾃动⽣成的,不加会出错**/if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PERMISSION_GRANTED) { // TODO: Consider calling// ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding// public void onRequestPermissionsResult(int requestCode, String[] permissions,// int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for ActivityCompat#requestPermissions for more details.return;}Location location = locationManager.getLastKnownLocation(provider); // 通过GPS获取位置updateLocation(location);}/*** 获取到当前位置的经纬度* @param location*/private void updateLocation(Location location) {if (location != null) {double latitude = location.getLatitude();double longitude = location.getLongitude();LogUtil.e("维度:" + latitude + "\n经度" + longitude);} else {LogUtil.e("⽆法获取到位置信息");}}/*** Android6.0申请权限的回调⽅法*/@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode) {// requestCode即所声明的权限获取码,在checkSelfPermission时传⼊case BAIDU_READ_PHONE_STATE://如果⽤户取消,permissions可能为null.if (grantResults[0] == PERMISSION_GRANTED && grantResults.length > 0) { //有权限// 获取到权限,作相应处理getLocation();} else {showGPSContacts();}break;default:break;}}onRequestPermissionsResult 这个⽅法主要是动态获取6.0权限,返回时的回调,我这⾥需求是获取权限之后获取到当前位置的经纬度详细信息3.下⾯是当点击获取GPS定位,跳转到系统开关,ActivityResult回调,我这⾥做的是必须要开启GPS权限,没有开启会⼀直让⽤户开启权限,怎么决定,看具体需求@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {case PRIVATE_CODE:showContacts();break;}}4.动态权限设置添加多条权限static final String[] LOCATIONGPS = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.READ_PHONE_STATE};注:代码很详细!基础知识写的不好,⼤佬勿喷,谢谢!以上这篇Android6.0获取GPS定位和获取位置权限和位置信息的⽅法就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
android 定位原理
android 定位原理Android定位原理是利用全球定位系统(Global Positioning System,简称GPS)、北斗导航系统、Wi-Fi、蓝牙和移动网络等技术来获取设备的地理位置信息。
具体工作原理如下:1. GPS定位:GPS定位是通过接收卫星发出的信号来计算设备的准确位置。
当设备开启GPS定位功能时,它会接收到来自卫星的信号,并通过三角定位原理计算出设备的经度、纬度和海拔信息。
GPS定位准确度较高,但需要有良好的卫星信号覆盖。
2. 北斗定位:北斗定位与GPS定位类似,但使用的是中国的北斗导航系统。
它通过接收北斗卫星发出的信号来确定设备的位置,可以在没有GPS信号的情况下进行定位。
北斗导航系统已经实现全球覆盖,所以在中国以及其他部分国家地区,设备可以通过北斗定位来获取地理位置。
3. Wi-Fi定位:Wi-Fi定位利用设备附近的Wi-Fi信号来确定设备所在的位置。
当设备连接到Wi-Fi网络时,它会扫描周围的Wi-Fi基站,并将扫描到的信息与地理位置数据库进行比对,从而确定设备的位置。
Wi-Fi定位定位准确度较高,尤其在城市区域有大量Wi-Fi覆盖的地方。
4. 蓝牙定位:蓝牙定位通过设备与周围的蓝牙设备进行通信来确定设备的位置。
当设备检测到附近的蓝牙设备时,它会通过蓝牙信号强度以及设备之间的距离来进行定位。
蓝牙定位通常用于室内环境中,准确度相对较低。
5. 移动网络定位:移动网络定位是通过设备连接的移动网络基站来确定设备的位置。
移动网络定位相比于其他定位方式,准确度较低,但可以在没有其他定位方式可用时提供大致的位置信息。
综上所述,Android定位原理是通过接收GPS、北斗定位、Wi-Fi、蓝牙和移动网络等信号,利用相应的定位技术来确定设备的地理位置信息。
不同的定位方式在准确度和使用场景上存在差异,可以根据实际需求选择合适的定位方式。
Android客户端GPS定位源码
AndroidManifest.xml文件配置<?xml version="1.0"encoding="utf-8"?><manifest xmlns:android="/apk/res/android"package="cn.itcast.main"android:versionCode="1"android:versionName="1.0"><application android:icon="@drawable/icon"android:label="@string/app_name"><activity android:name=".Main"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN"/><categoryandroid:name="UNCHER"/></intent-filter></activity><uses-library android:name="com.google.android.maps"/> </application><uses-permission android:name="android.permission.INTERNET"/> <uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permissionandroid:name="android.permission.ACCESS_FIND_LOCATION"/></manifest>Main.java文件package cn.itcast.main;import java.util.List;import com.google.android.maps.GeoPoint;import com.google.android.maps.MapActivity;import com.google.android.maps.MapController;import com.google.android.maps.MapView;import com.google.android.maps.Overlay;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.content.DialogInterface.OnClickListener;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Point;import android.location.Address;import android.location.Criteria;import android.location.Geocoder;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.view.MotionEvent;import android.widget.TextView;public class Main extends MapActivity{private MapController mapController;private GeoPoint geoPoint;private String msg;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);//获得mapviewMapView mapView=(MapView) this.findViewById(R.id.mapview);//地图的显示格式为交通图mapView.setTraffic(true);//设置可控mapView.setClickable(true);mapView.setEnabled(true);mapView.setBuiltInZoomControls(true);//得到gps设备的访问LocationManager locationManager=(LocationManager) getSystemService(Context.LOCATION_SERVICE);//设置gps定位配置Criteria criteria=new Criteria();//设置显示精度criteria.setAccuracy(Criteria.ACCURACY_COARSE);//是否获得海拔数据criteria.setAltitudeRequired(false);//是否获得方向数据criteria.setBearingRequired(false);//是否允许运营商计费criteria.setCostAllowed(true);//设置耗电程度criteria.setPowerRequirement(Criteria.POWER_LOW);//获得服务供应商String provider=locationManager.getBestProvider(criteria, true);//获取上一个定位点Locationlocation=locationManager.getLastKnownLocation(provider);//获得gps定位坐标信息Double latitude=location.getLatitude()*1E6;Double longitude=location.getLongitude()*1E6;//获得卫星定位点geoPoint=newGeoPoint(latitude.intValue(),longitude.intValue());//获得地图控制器mapController=mapView.getController();//设置地图显示初始化精度mapController.setZoom(12);mapController.animateTo(geoPoint);//实例化自定义绘图层MyOverlay myOverlay=new MyOverlay();//为mapview添加绘图层mapView.getOverlays().add(myOverlay);//定义一个final,TextView,以备子类引用final TextView textView=(TextView) findViewById(R.id.textview); LocationListener locationListener=new LocationListener() {@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {}@Overridepublic void onProviderEnabled(String provider) {// TODO Auto-generated method stub}@Overridepublic void onProviderDisabled(String provider) {// TODO Auto-generated method stub}@Overridepublic void onLocationChanged(Location location) {Double latitude=location.getLatitude()*1E6;Double longitude=location.getLongitude()*1E6;try {//获得精度纬度字符串msg = "经度:" + location.getLongitude() + "\n";msg += "纬度:" + location.getLatitude() + "\n";//根据经纬度获得改点地址信息Geocoder gc=new Geocoder(Main.this);List<Address> addresses=gc.getFromLocation(latitude, longitude, 1);if (addresses.size()>0) {//获得地址信息msg+="AddressLine:"+addresses.get(0).getAddressLine(0)+"\n";//获得国家名msg += "CountryName:" +addresses.get(0).getCountryName()+"\n";msg+= "Locality:"+ addresses.get(0).getLocality() + "\n";msg += "FeatureName:" +addresses.get(0).getFeatureName();}textView.setText(msg);} catch (Exception e) {e.printStackTrace();}}};//注册位置监听器,1秒钟扫描1次locationManager.requestLocationUpdates(provider, 1000, 0, locationListener);}class MyOverlay extends Overlay{//保证触控事件不重复操作p rivate int count=0;@Overridepublic boolean draw(Canvas canvas, MapView mapView, boolean shadow,long when) {//定义画笔Paint paint=new Paint();paint.setColor(Color.RED);//定义屏幕点Point screenPoint=new Point();//gps点转屏幕点mapView.getProjection().toPixels(geoPoint, screenPoint);//获得gps标志点图片Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.flag);//绘制gps点图片canvas.drawBitmap(bitmap, screenPoint.x,screenPoint.y, paint);//绘制文字说明canvas.drawText("当前位置", screenPoint.x, screenPoint.y, paint);return super.draw(canvas, mapView, shadow, when);}@Overridepublic boolean onTouchEvent(MotionEvent e, MapView mapView) { //定义一个屏幕点Point screenPoint=new Point();//把gps点变成屏幕点mapView.getProjection().toPixels(geoPoint, screenPoint);//获得触点坐标int currentX=(int) e.getX();int currentY=(int) e.getY();//在50,30范围内触碰,显示当前经纬度if((currentX-screenPoint.x)>=0&&(currentX-screenPoint.x)<50&&(currentY-screenPoint.y>=0)&&(currentY-screenPoint.y)<30) {if (count==0) {new AlertDialog.Builder(Main.this).setMessage(msg).setPositiveButton("确定",new OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which) {count=0;}}).show();}count++;}return super.onTouchEvent(e, mapView);}}@Overrideprotected boolean isRouteDisplayed() {// TODO Auto-generated method stubreturn false;}}注1:如果你的手机上没有gps定位系统,会有以下错误08-10 13:04:55.610: ERROR/AndroidRuntime(492): ng.RuntimeException: Unable to start activity ComponentInfo{cn.itcast.main/cn.itcast.main.Main}:ng.IllegalArgumentException: provider==null注2:记得去google官网/intl/zh-CN/android/maps-api-signup.html申请自己机器的apikeyC:\Documents and Settings\Administrator\.android>keytool -list -keystore debug.kEystore默认密码android我机器的apikey,你用不好使<com.google.android.maps.MapViewandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:apiKey="0EITsWoXq7NC_mgKW6yIxIViNLhMGsIW4dbmlsg />最终实现效果:随着android客户端得移动,在地图上提供精确的当前所在位置本编码和注释由刘国栋提供,祝大家编码顺利。
安卓虚拟定位的原理
安卓虚拟定位的原理安卓虚拟定位是指通过软件技术改变设备上的位置信息,让设备展示一个虚假的位置。
这种技术被广泛应用于各种领域,包括游戏、导航、社交媒体等。
安卓虚拟定位的原理主要是通过模拟GPS信号来实现。
GPS(Global Positioning System)是一种全球卫星定位系统,通过接收卫星发射的信号来计算设备的准确位置。
在安卓系统中,定位功能主要是通过与GPS芯片进行交互来获取位置信息。
而对于虚拟定位,软件会通过与GPS芯片进行交互,并修改获取到的位置信息进行模拟。
具体操作上,软件会通过修改设备的GPS数据流来实现虚拟定位。
在接收到GPS数据之后,软件会将数据进行解析并修改,然后再将修改后的数据传递给应用程序。
这样,无论是使用导航软件、游戏应用,还是在社交媒体上发布位置信息,都会展示虚拟定位的位置而不是真实的位置。
为了实现虚拟定位,安卓系统需要进行一些操作。
首先,需要获取系统权限以修改定位数据流。
然后,软件将会对GPS数据进行修改,包括经纬度、高度、速度等信息。
最后,修改后的位置信息将被传递给相关应用程序,使其认为设备当前在虚拟定位的位置。
虚拟定位在各种场景中有不同的应用。
在游戏中,虚拟定位可以帮助玩家在游戏中改变自己的位置,从而获得游戏中的一些优势。
在导航领域,虚拟定位可以帮助用户避开拥堵路段或者规避危险区域。
在社交媒体上,虚拟定位可以让用户分享特定地点的照片或者状态,而不需要实际到达那个位置。
然而,虚拟定位也可能带来一些安全隐患。
有些人可能利用虚拟定位来进行恶意行为,例如在游戏中作弊,或者故意发布虚假的位置信息。
这些行为可能对其他用户或者系统造成不良影响。
总之,安卓虚拟定位利用GPS信号的模拟来改变设备的位置信息,从而实现虚假的定位效果。
虚拟定位在各种应用场景中有广泛的应用,但同时也需要注意安全隐患。
客户端开发教程:学会使用常见的位置定位技术(十)
在移动应用开发中,位置定位技术是一个非常重要的环节。
通过使用位置定位技术,我们可以为用户提供更加准确的服务,例如查找附近的餐馆、导航到目的地等。
本文将介绍一些常见的位置定位技术,并教你如何在客户端开发中使用它们。
1. GPS定位GPS(全球定位系统)是最常见和最常用的位置定位技术之一。
几乎所有智能手机都配备了GPS芯片,可以通过与卫星的通信来获取设备的地理位置信息。
在客户端开发中,我们可以使用手机操作系统提供的API来获取GPS定位信息。
首先,我们需要在文件中添加定位权限。
在``<manifest>``标签内添加以下代码:```<uses-permission android:name="_FINE_LOCATION" />```然后,我们可以在代码中使用LocationManager类来获取GPS定位信息。
以下是一个示例代码:```LocationManager locationManager = (LocationManager) getSystemService(_SERVICE);LocationListener locationListener = new MyLocationListener();(_PROVIDER, 0, 0, locationListener);```在上面的代码中,我们首先获取LocationManager对象,并创建一个实现LocationListener接口的自定义类MyLocationListener。
然后,我们使用requestLocationUpdates方法来注册位置更新监听器,其中GPS_PROVIDER参数表示我们要使用GPS定位。
在MyLocationListener类中,我们可以实现onLocationChanged方法来处理位置更新事件。
例如,我们可以在该方法中获取到最新的经纬度信息:```public void onLocationChanged(Location location) {double latitude = ();double longitude = ();// 处理经纬度信息}```通过上述步骤,我们就可以在客户端应用中使用GPS定位技术了。
Android-Google的定位和地图-详细版
Android——定位和地图Location and MapsQuickview∙你的应用程序可以利用Android提供的定位框架(location framework)来确定设备的位置和方向,并且能够进行更新。
∙可以利用Google Maps外部类库来显示和管理地图数据开发基于地理位置的服务可以使用android.location类和Google Maps 外部类库来开发。
Location Services可以利用android.location包来访问设备中的定位服务。
Location framework的核心组件是LocationManager系统服务,该服务提供了确定位置的APIs和内置设备的方向(应该是电子罗盘了,如果可用的话)。
要获得一个LocationManager的实例,无需直接初始化,而是通过调用 getSystemService(Context.LOCATION_SERVICE)来获取一个实例。
一旦获得一个LocationManager的实例,你就可以在程序中做如下三件事:∙Query for the list of all LocationProviders for the last known user location.∙注册/解注册到一个定位提供商(specified either by criteria or name)来周期性地更新用户的当前位置。
∙Register/unregister for a given Intent to be fired if the device comes withina given proximity (specified by radius in meters) of a given lat/long. Google Maps External LibraryGoogle提供的地图外部类库——com.google.android.maps package. 这个包的类提供了内建的地图碎片的下载、翻译和缓存, 此外,还有很多显示选项和控制。
AndroidGPS应用开发
AndroidGPS应⽤开发GPS定位系统由三部分组成,即由GPS卫星组成的空间部分,若⼲地⾯组成的控制部分和普通⽤户⼿中的接收机这三部分。
对于⼿机⽤户来说,⼿机就是GPS定位系统的接收机,也就是说GPS定位需要⼿机的硬件⽀持GPS功能。
⼀、核⼼API Android为GPS功能⽀持专门提供了⼀个LocationManager类,LocationManager lm=(LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);其常⽤⽅法如下:> boolean addGpsStatusListener(GpsStatus.Listener listener): 添加⼀个监听GPS状态的监听器> void addProximityAlert(double latitude,double longitude,float radius, long expiration, PendingIntent intent): 添加⼀个临近警告> List<String> getAllProviders(): 获取所有的LocationProvider列表> String getBestProvider(Criteria criteria,boolean enabledOnly): 根据指定条件返回最优的LocationProvider对象> GpsStatus getGpsStatus(GpsStatus status): 获取GPS状态> Location getLastKnownLocation(String provider): 根据LocationProvider获取最近⼀次已知的Location> LocationProvider getProvider(String name): 根据名称来获取LocationProvider> List<String> getProviders(Criteria criteria,boolean enabledOnly): 根据指定条件获取满⾜该条件的全部LocationProvider的名称> List<String> getProviders(boolean enabledOnly): 获取所有可⽤的LocationProvider> boolean isProviderEnabled(provider): 判断指定名称的LocationProvider是否可⽤> void removeGpsStatusListener(GpsStatus.Listener listener): 删除Gps状态监听器> void removeProximityAlert(PendingIntent intent): 删除⼀个临近警告> void requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent): 通过指定的LoactionProvider周期性地获取定位信息,并通过intent启动相应的组件。
有关Android中的AGPS
*/ int (*data_conn_open)( const char* apn ); /** * Notifies that the AGPS data connection has been closed. */ int (*data_conn_closed)(); /** * Notifies that a data connection is not available for AGPS. */ int (*data_conn_failed)(); /** * Sets the hostname and port for the AGPS server. */ int (*set_server)( AGpsType type, const char* hostname, int port ); } AgpsInterface;
3.AGPS 在 Android 中的实现
原生的 Android 源码中并没有 AGPS 的实现方式,我们以 PQXU2 为 例来观察 AGPS 的运作过程。下面是 HAL 层头文件中关于 AGPS 定义的接口 及回调函数。
/** Represents the status of AGPS. */
typedef struct {
/** set to sizeof(AGpsStatus) */
size_t
size;
AGpsType
type;
AGpsStatusValue status;
} AGpsStatus;
/** Callback with AGPS status information. * Can only be called from a thread created by create_thread_cb. */ typedef void (* agps_status_callback)(AGpsStatus* status);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、LocationManagerLocationMangager,位置管理器。
要想操作定位相关设备,必须先定义个LocationManager。
我们可以通过如下代码创建LocationManger对象。
LocationMangerlocationManager=(LocationManager)this.getSystemService(Context.LOCATION_SERVICE );二、LocationListenerLocationListener,位置监听,监听位置变化,监听设备开关与状态。
private LocationListener locationListener=new LocationListener() {/*** 位置信息变化时触发*/public void onLocationChanged(Location location) {updateView(location);Log.i(TAG, "时间:"+location.getTime());Log.i(TAG, "经度:"+location.getLongitude());Log.i(TAG, "纬度:"+location.getLatitude());Log.i(TAG, "海拔:"+location.getAltitude());}/*** GPS状态变化时触发*/public void onStatusChanged(String provider, int status, Bundle extras) {switch(status) {//GPS状态为可见时case LocationProvider.AVAILABLE:Log.i(TAG, "当前GPS状态为可见状态");break;//GPS状态为服务区外时case LocationProvider.OUT_OF_SERVICE:Log.i(TAG, "当前GPS状态为服务区外状态");break;//GPS状态为暂停服务时case LocationProvider.TEMPORARILY_UNAVAILABLE:Log.i(TAG, "当前GPS状态为暂停服务状态");break;}}/*** GPS开启时触发*/public void onProviderEnabled(String provider) {Location location=lm.getLastKnownLocation(provider);updateView(location);}/*** GPS禁用时触发*/public void onProviderDisabled(String provider) {updateView(null);}};三、LocationLocation,位置信息,通过Location可以获取时间、经纬度、海拔等位置信息。
上面采用locationListener里面的onLocationChanged()来获取location,下面讲述如何主动获取location。
Locationlocation=locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);system.out.println("时间:"+location.getTime());system.out.println("经度:"+location.getLongitude());注意:Location location=new Location(LocationManager.GPS_PROVIDER)方式获取的location的各个参数值都是为0。
四、GpsStatus.ListenerGpsStatus.Listener ,GPS状态监听,包括GPS启动、停止、第一次定位、卫星变化等事件。
//状态监听GpsStatus.Listener listener = new GpsStatus.Listener() {public void onGpsStatusChanged(int event) {switch(event) {//第一次定位case GpsStatus.GPS_EVENT_FIRST_FIX:Log.i(TAG, "第一次定位");break;//卫星状态改变case GpsStatus.GPS_EVENT_SATELLITE_STATUS:Log.i(TAG, "卫星状态改变");//获取当前状态GpsStatus gpsStatus=lm.getGpsStatus(null);//获取卫星颗数的默认最大值int maxSatellites = gpsStatus.getMaxSatellites();//创建一个迭代器保存所有卫星Iterator<GpsSatellite> iters =gpsStatus.getSatellites().iterator();int count = 0;while(iters.hasNext() && count <= maxSatellites) {GpsSatellite s = iters.next();count++;}System.out.println("搜索到:"+count+"颗卫星");break;//定位启动case GpsStatus.GPS_EVENT_STARTED:Log.i(TAG, "定位启动");break;//定位结束case GpsStatus.GPS_EVENT_STOPPED:Log.i(TAG, "定位结束");break;}};};//绑定监听状态lm.addGpsStatusListener(listener);五、GpsStatusGpsStatus,GPS状态信息,上面在卫星状态变化时,我们就用到了GpsStatus。
//实例化GpsStatus gpsStatus = locationManager.getGpsStatus(null); // 获取当前状态//获取默认最大卫星数int maxSatellites = gpsStatus.getMaxSatellites();//获取第一次定位时间(启动到第一次定位)int costTime=gpsStatus.getTimeToFirstFix();//获取卫星Iterable<GpsSatellite> iterable=gpsStatus.getSatellites();//一般再次转换成IteratorIterator<GpsSatellite> itrator=iterable.iterator();六、GpsSatelliteGpsSatellite,定位卫星,包含卫星的方位、高度、伪随机噪声码、信噪比等信息。
//获取卫星Iterable<GpsSatellite> iterable=gpsStatus.getSatellites();//再次转换成IteratorIterator<GpsSatellite> itrator=iterable.iterator();//通过遍历重新整理为ArrayListArrayList<GpsSatellite> satelliteList=new ArrayList<GpsSatellite>();int count=0;int maxSatellites=gpsStatus.getMaxSatellites();while(itrator.hasNext() && count <= maxSatellites) {GpsSatellite satellite = itrator.next();satelliteList.add(satellite);count++;}System.out.println("总共搜索到"+count+"颗卫星");//输出卫星信息for(int i=0;i<satelliteList.size();i++){//卫星的方位角,浮点型数据System.out.println(satelliteList.get(i).getAzimuth());//卫星的高度,浮点型数据System.out.println(satelliteList.get(i).getElevation());//卫星的伪随机噪声码,整形数据System.out.println(satelliteList.get(i).getPrn());//卫星的信噪比,浮点型数据System.out.println(satelliteList.get(i).getSnr());//卫星是否有年历表,布尔型数据System.out.println(satelliteList.get(i).hasAlmanac());//卫星是否有星历表,布尔型数据System.out.println(satelliteList.get(i).hasEphemeris());//卫星是否被用于近期的GPS修正计算System.out.println(satelliteList.get(i).hasAlmanac());}为了便于理解,接下来模拟一个案例,如何在程序代码中使用GPS获取位置信息。
第一步:新建一个Android工程项目,命名为mygps,目录结构如下第二步:修改main.xml布局文件,修改内容如下:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><EditText android:layout_width="fill_parent"android:layout_height="wrap_content"android:cursorVisible="false"android:editable="false"android:id="@+id/editText"/></LinearLayout>第三步:实用Adnroid平台的GPS设备,需要添加上权限<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATIO N"/>第四步:修改核心组件activity,修改内容如下package com.ljq.activity;import java.util.Iterator;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.location.Criteria;import android.location.GpsSatellite;import android.location.GpsStatus;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.location.LocationProvider;import android.os.Bundle;import android.provider.Settings;import android.util.Log;import android.widget.EditText;import android.widget.Toast;public class GpsActivity extends Activity {private EditText editText;private LocationManager lm;private static final String TAG="GpsActivity";@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();lm.removeUpdates(locationListener);}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);editText=(EditText)findViewById(R.id.editText);lm=(LocationManager)getSystemService(Context.LOCATION_SERVICE);//判断GPS是否正常启动if(!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)){Toast.makeText(this, "请开启GPS导航...",Toast.LENGTH_SHORT).show();//返回开启GPS导航设置界面Intent intent= new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);startActivityForResult(intent,0);return;}//为获取地理位置信息时设置查询条件String bestProvider = lm.getBestProvider(getCriteria(), true);//获取位置信息//如果不设置查询要求,getLastKnownLocation方法传人的参数为LocationManager.GPS_PROVIDERLocation location= lm.getLastKnownLocation(bestProvider);updateView(location);//监听状态lm.addGpsStatusListener(listener);//绑定监听,有4个参数//参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种//参数2,位置信息更新周期,单位毫秒//参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息//参数4,监听//备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新// 1秒更新一次,或最小位移变化超过1米更新一次;//注意:此处更新准确度非常低,推荐在service里面启动一个Thread,在run中sleep(10000);然后执行handler.sendMessage(),更新位置lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locationListener);}//位置监听private LocationListener locationListener=new LocationListener() {/*** 位置信息变化时触发*/public void onLocationChanged(Location location) {updateView(location);Log.i(TAG, "时间:"+location.getTime());Log.i(TAG, "经度:"+location.getLongitude());Log.i(TAG, "纬度:"+location.getLatitude());Log.i(TAG, "海拔:"+location.getAltitude());}/*** GPS状态变化时触发*/public void onStatusChanged(String provider, int status, Bundle extras) {switch(status) {//GPS状态为可见时case LocationProvider.AVAILABLE:Log.i(TAG, "当前GPS状态为可见状态");break;//GPS状态为服务区外时case LocationProvider.OUT_OF_SERVICE:Log.i(TAG, "当前GPS状态为服务区外状态");break;//GPS状态为暂停服务时case LocationProvider.TEMPORARILY_UNAVAILABLE:Log.i(TAG, "当前GPS状态为暂停服务状态");break;}}/*** GPS开启时触发*/public void onProviderEnabled(String provider) {Location location=lm.getLastKnownLocation(provider);updateView(location);}/*** GPS禁用时触发*/public void onProviderDisabled(String provider) {updateView(null);}};//状态监听GpsStatus.Listener listener = new GpsStatus.Listener() {public void onGpsStatusChanged(int event) {switch(event) {//第一次定位case GpsStatus.GPS_EVENT_FIRST_FIX:Log.i(TAG, "第一次定位");break;//卫星状态改变case GpsStatus.GPS_EVENT_SATELLITE_STATUS:Log.i(TAG, "卫星状态改变");//获取当前状态GpsStatus gpsStatus=lm.getGpsStatus(null);//获取卫星颗数的默认最大值int maxSatellites = gpsStatus.getMaxSatellites();//创建一个迭代器保存所有卫星Iterator<GpsSatellite> iters =gpsStatus.getSatellites().iterator();int count = 0;while(iters.hasNext() && count <= maxSatellites) {GpsSatellite s = iters.next();count++;}System.out.println("搜索到:"+count+"颗卫星");break;//定位启动case GpsStatus.GPS_EVENT_STARTED:Log.i(TAG, "定位启动");break;//定位结束case GpsStatus.GPS_EVENT_STOPPED:Log.i(TAG, "定位结束");break;}};};/*** 实时更新文本内容** @param location*/private void updateView(Location location){if(location!=null){editText.setText("设备位置信息\n\n经度:");editText.append(String.valueOf(location.getLongitude()));editText.append("\n纬度:");editText.append(String.valueOf(location.getLatitude()));}else{//清空EditText对象editText.getEditableText().clear();}}/*** 返回查询条件* @return*/private Criteria getCriteria(){Criteria criteria=new Criteria();//设置定位精确度 Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE则比较精细criteria.setAccuracy(Criteria.ACCURACY_FINE);//设置是否要求速度criteria.setSpeedRequired(false);// 设置是否允许运营商收费criteria.setCostAllowed(false);//设置是否需要方位信息criteria.setBearingRequired(false);//设置是否需要海拔信息criteria.setAltitudeRequired(false);// 设置对电源的需求criteria.setPowerRequirement(Criteria.POWER_LOW);return criteria;}}第五步:启动模拟器,如果启动完成,请在Myeclipse中按如下选项一步一步操作:Emulator Control->Location Controls->Manual->选中Decimal->输入经纬度,类似如下演示效果如下:。