在前文Android定位功能(一)中,已经大致介绍了一下在Android平台中,和定位功能相关的类,并举例获取了位置信息。但是前文是基于Criteria定制了一个标准,通过getBestProvider()方法由Android系统自动获取最符合Criteria的LocationProvider,从而实现了定位功能。这样的做法能最大限度的保证定位功能的可实现性,但是却无法保证获取到的位置信息有最大的准确度。因为除了GPS外,其他定位方式都或多或少存在着位置偏移。

  在实现GPS定位前,先了解一下GPS的部分特性:

  1. GPS定位需要依靠3颗或3颗以上的卫星。

  2. GPS定位受环境影响较大,在晴朗的空地上,较容易搜索到卫星,而在室内通常是无法搜索到卫星的。

  3. GPS定位需要使用GPS功能模块,而GPS功能模块的耗电量是巨大的。

  在Android系统中,实现GPS定位的思路应该是:

  1. 获取GPS的Location Provider。

  2. 讲此Provider传入到requestLocationUpdates()方法,让Android系统获知搜索位置方式。

  3. 创建实现了GpsStatus.Listener接口的对象,重写onGpsStatusChanged()方法,向LocationManager添加次监听器,检测卫星状态。(可选步骤)

  根据以上思路,仿照Android定位功能(一)中的例子,可以很容易的得到以下实现代码:(此代码的实现前提是GPS功能模块处于打开状态) 

public class MainActivity extends Activity {private LocationManager locationManager;private GpsStatus gpsstatus;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);//获取到LocationManager对象locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);//根据设置的Criteria对象,获取最符合此标准的provider对象String currentProvider = locationManager.getProvider(LocationManager.GPS_PROVIDER).getName();//根据当前provider对象获取最后一次位置信息Location currentLocation = locationManager.getLastKnownLocation(currentProvider);//如果位置信息为null,则请求更新位置信息if(currentLocation == null){locationManager.requestLocationUpdates(currentProvider, 0, 0, locationListener);}//增加GPS状态监听器locationManager.addGpsStatusListener(gpsListener);//直到获得最后一次位置信息为止,如果未获得最后一次位置信息,则显示默认经纬度//每隔10秒获取一次位置信息while(true){currentLocation = locationManager.getLastKnownLocation(currentProvider);if(currentLocation != null){Log.d("Location", "Latitude: " + currentLocation.getLatitude());Log.d("Location", "location: " + currentLocation.getLongitude());break;}else{Log.d("Location", "Latitude: " + 0);Log.d("Location", "location: " + 0);}try {Thread.sleep(10000);} catch (InterruptedException e) {Log.e("Location", e.getMessage());}}}private GpsStatus.Listener gpsListener = new GpsStatus.Listener(){//GPS状态发生变化时触发@Overridepublic void onGpsStatusChanged(int event) {//获取当前状态gpsstatus=locationManager.getGpsStatus(null);switch(event){//第一次定位时的事件case GpsStatus.GPS_EVENT_FIRST_FIX:break;//开始定位的事件case GpsStatus.GPS_EVENT_STARTED:break;//发送GPS卫星状态事件case GpsStatus.GPS_EVENT_SATELLITE_STATUS:Toast.makeText(MainActivity.this, "GPS_EVENT_SATELLITE_STATUS", Toast.LENGTH_SHORT).show();Iterable<GpsSatellite> allSatellites = gpsstatus.getSatellites();   Iterator<GpsSatellite> it=allSatellites.iterator(); int count = 0;while(it.hasNext())   {   count++;}Toast.makeText(MainActivity.this, "Satellite Count:" + count, Toast.LENGTH_SHORT).show();break;//停止定位事件case GpsStatus.GPS_EVENT_STOPPED:Log.d("Location", "GPS_EVENT_STOPPED");break;}}};//创建位置监听器private LocationListener locationListener = new LocationListener(){//位置发生改变时调用@Overridepublic void onLocationChanged(Location location) {Log.d("Location", "onLocationChanged");}//provider失效时调用@Overridepublic void onProviderDisabled(String provider) {Log.d("Location", "onProviderDisabled");}//provider启用时调用@Overridepublic void onProviderEnabled(String provider) {Log.d("Location", "onProviderEnabled");}//状态改变时调用@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {Log.d("Location", "onStatusChanged");}};}

通过以上代码中的注释部分,可以清晰的知道Android定位功能里相关方法的具体含义。希望对大家有用。

  另外,因为GPS的自身特性,此代码在室内几乎无法定位,所以建议再真正的实际项目里,至少使用network和GPS两种不同的Location Provider实现定位功能。

  本人暂时未找到同时关闭网络和GPS功能实现定位的方法,本人也未找到通过代码在没有ROOT的前提下直接代开网络和GPS功能的代码。如果大家在这两方面有自己的体会,请不吝赐教,留言评论或给出参考地址都可。大家一同探讨,一同进步。

================================================================= 
本博文系本博客主原创,版权归本博客主所有,如需转载,请注明转载地址。 
博客原始地址:wisekingokok.cnblogs.com 
=================================================================

Android定位功能(二)相关推荐

  1. 基于百度地图实现Android定位功能实现(详解+教程)

    基于百度地图实现Android定位功能实现(详解+教程) 1.初始化 (一)获取到SHA1 (1)找到View中的Tool Windows并打开Terminal (2)找到你的jdk的bin目录,小编 ...

  2. 基于百度地图实现Android定位功能实现

    基于百度地图实现Android定位功能实现 初始化 一>获取SHA1 二>Android studio 配置 (1)下载百度地图sdk (2)解压安装包 (3)回到刚刚配置的jar包,右击 ...

  3. android 定位功能的实现

    在Android开发其中.常常须要用到定位功能,尤其是依赖于地理位置功能的应用.非常多人喜欢使用百度地图,高德地图提供的sdk.开放API,可是在只须要经纬度,或者城市,街道地址等信息.并不须要提供预 ...

  4. Android 定位功能简单实现

    文章目录 背景 实现方式 实现关键代码 结果验证图示 背景 在个人 App:Hi朋友中完善天气查询功能时,需要定位用户当前所在的城市,需要用到手机的定位功能.让用户打开天气查询页时,能够自动定位当前所 ...

  5. Android定位功能开发(1)——获取位置

    基于位置的服务包括三个方面:获取位置.地图服务.地理编码服务. 获取位置有两种方式,一种是通过GPS获得位置,精度高,耗电高,另一种是通过WLAN或通讯基站获得位置,精度低,耗电低.得到的位置信息是三 ...

  6. Android定位功能开发(3)——地图服务(地图点与经纬度)

    基本的地图服务包括三项功能: 让地图显示某个经纬度位置: 获取地图上某个点的经纬度: 在地图上标注出某个位置. 要让地图显示某个经纬度位置,步骤是:获取BaiduMap对象.设置位置.动画显示. 代码 ...

  7. android定位:获取当前位置的经纬度

    Android定位主要使用的是基于位置服务(Location Based Service)技术,有了 Android 系统作为载体,我们可以利用定位出的位置进行许多丰富多彩的操作,比如定位城市,根据我 ...

  8. Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用

    转载请注明出处http://blog.csdn.net/xiaanming/article/details/11380619 这一篇文章主要讲解的是百度地图的定位功能,然后还有MyLocationOv ...

  9. Android利用百度地图API实现定位功能(记录)

    本篇主要介绍一下如何使用百度地图API来实现定位以及地图的基本使用. 效果图如下: 步骤如下: 一.申请APIKey. (1)注册百度账号并申请开发者资质:http://developer.baidu ...

最新文章

  1. 一步步学习SPD2010--第十一章节--处理母版页(7)--管理Content Placeholders
  2. 互联网协议 — MQTT 消息队列遥测传输协议
  3. 关于scrollTop为0以及解决方法
  4. php写web服务器端,如何用php实现一个web服务器
  5. java.lang.NoSuchFieldError: EMPTY_ORDERED_ITERATOR起因及解决办法
  6. SparkHiveSQL中Join操作的谓词下推?
  7. 转 python测试框架最全资源汇总
  8. Matplotlib 中文用户指南 4.3 文本属性及布局
  9. 中台彻底搞砸了?下一站,小中台大前台
  10. 浅谈linux线程模型和线程切换
  11. 螃蟹先生2 android,螃蟹先生2
  12. 启动、关闭、刷新 WINDOWS服务
  13. iOS底层探索之类的加载(二): realizeClassWithoutSwift分析
  14. 【reproject_inter】fits头文件的映射(1,改变fits文件的数据范围,2,对坐标系进行投影转换)
  15. Windows 技术篇-win10、win7设置电脑自动锁屏(非关闭显示器),设置电脑黑屏并锁屏方法
  16. 集合的三种遍历方式/集合的嵌套/产生任意范围内的随机数
  17. php中的implode,php里implode是什么意思
  18. 为什么镜子里的影像左右颠倒而不是上下颠倒 - Google 谷歌 百度 baidu 阿里巴巴 alibaba 微软 华
  19. ​VC深思考:在商还得言商!
  20. 零时科技 || DPC攻击事件分析

热门文章

  1. 密码加密解密(一)——摩斯密码
  2. grabcut利用matlab如何实现,matlab_grabcut-master 用 实现了 的图像分割的源代码供参考 OpenCV 272万源代码下载- www.pudn.com...
  3. 云原生究竟怎么落地?
  4. 中粮、益海品牌集中度提高,中小米企机会在高端细分市场
  5. 《干法》喜欢的金句(一)
  6. 保护计算机组件免受esd,USB3.0接口的ESD防护设计
  7. 单片机ESD静电防护总结
  8. ppt怎么把图片做成翻书效果_ppt怎么做出翻页效果图文教程
  9. MFC中制作Dll中带对话框资源的动态库
  10. 微信读书vscode插件_曾经我以为 VSCode 是程序员专属的工具,直到发现了这些……...