本文转自:https://juejin.cn/post/6986580983134814216

Android 提供LocationManager等相关API用于获取位置信息。

一、权限申请

1.1 APP申请定位权限

Manifest 文件中添加以下权限:

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  1. ACCESS_COARSE_LOCATION:
    允许一个程序访问CellID或WiFi热点来获取粗略的位置
  2. ACCESS_FINE_LOCATION:
    允许一个程序访问精良位置(如GPS)

2.1 开启手机定位服务

只有位置权限是不够的,还需要开启手机定位服务才能获取到位置信息。

  /*** 判断是否开启了GPS或网络定位开关*/public boolean isLocationProviderEnabled() {boolean result = false;LocationManager locationManager = (LocationManager) SDWanVPNApplication.getAppContext().getSystemService(LOCATION_SERVICE);if (locationManager == null) {return false;}if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {result = true;}return result;}/*** 跳转到设置界面,引导用户开启定位服务*/
private void openLocationServer() {Intent i = new Intent();i.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);startActivityForResult(i, REQUEST_CODE_LOCATION_SERVER);
}

二、监听位置信息

Android 可以通过网络或者GPS,获取位置信息。GPS获取比较准确,但是在室内有时候比较难获取到。

  private final LocationListener mLocationListener = new LocationListener() {// Provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {Log.d(TAG, "onStatusChanged");}// Provider被enable时触发此函数,比如GPS被打开@Overridepublic void onProviderEnabled(String provider) {Log.d(TAG, "onProviderEnabled");}// Provider被disable时触发此函数,比如GPS被关闭@Overridepublic void onProviderDisabled(String provider) {Log.d(TAG, "onProviderDisabled");}//当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发@Overridepublic void onLocationChanged(Location location) {Log.d(TAG, String.format("location: longitude: %f, latitude: %f", location.getLongitude(),location.getLatitude()));//更新位置信息}};/*** 监听位置变化*/private void initLocationListener() {LocationManager locationManager = (LocationManager) MyApplication.getAppContext().getSystemService(LOCATION_SERVICE);if (locationManager == null) {return;}locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 10, mLocationListener);locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10, mLocationListener);}

其中最重要的就是 requestLocationUpdates 方法,使用指定的提供程序注册位置信息:

requestLocationUpdates(String provider, long minTime, float
minDistance, LocationListener listener) provider:注册的位置提供者名称
minTime:位置更新之间的最小时间间隔,以毫秒为单位 minDistance:位置更新之间的最小距离,以米为单位
listener:位置更新回调方法

该方法内部是通过handler进行通知回调,如果在非主线程调用该方法,需要多传入一个Looper参数:

    Looper.prepare();locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 10, mLocationListener, Looper.myLooper());locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10, mLocationListener, Looper.myLooper());

如果只需要获取一次位置信息,获取后可以取消位置监听。

    locationManager.removeUpdates(mLocationListener);

三、获取最近一次位置信息

有时候由于各种原因例如在室内、网络问题等,导致注册的位置监听无法及时返回位置信息,这个时候可以使用 getLastKnownLocation 方法返回一个从给定提供程序获得的最后一个已知位置数据。

  private Location getLastLocation() {Location location = null;LocationManager locationManager = (LocationManager) SDWanVPNApplication.getAppContext().getSystemService(LOCATION_SERVICE);if (locationManager == null) {return null;}List<String> providers = locationManager.getProviders(true);for (String provider : providers) {Location l = locationManager.getLastKnownLocation(provider);if (l == null) {continue;}if (location == null || l.getAccuracy() < location.getAccuracy()) {// Found best last known location: %s", l);location = l;}}return location;}

四、通过经纬度获取详细地址

Geocoder 相关API,支持通过经纬度获取详细位置信息

  public static void getAddress(double latitude, double longitude) {List<Address> addressList = null;Geocoder geocoder = new Geocoder(MyApplication.getAppContext());try {addressList = geocoder.getFromLocation(latitude, longitude, 1);} catch (IOException e) {e.printStackTrace();}if (addressList != null) {for (Address address : addressList) {Log.d(TAG, String.format("address: %s", address.toString()));}}}

打印结果如下:

address: Address[addressLines=[0:"福建省厦门市集美区诚毅北大街"],feature=null,admin=福建省,sub-admin=后溪镇,locality=厦门市,thoroughfare=诚毅北大街,postalCode=null,countryCode=CN,countryName=中国,hasLatitude=true,latitude=24.622825253598176,hasLongitude=true,longitude=118.05078728444207,phone=null,url=null,extras=null]

五、坐标系介绍

获取经纬度后在地图上查询发现,位置存在一定偏移,这个是因为使用的坐标系不一致引起的。
我国出于国家安全的考虑,会将所有的电子地图经行加偏处理,由真实的地理坐标系又称地球坐标系(WGS84)转换为火星坐标系(GCJ02),但是使用 location 获取的经纬度又是WGS84坐标系的,所以再其他地图上显示会出现位置偏移现象。
目前坐标系主要有以下几种:

WGS84坐标系:地球坐标系,国际通用坐标系
GCJ02坐标系:火星坐标系,WGS84坐标系加密后的坐标系,Google国内地图、高德、QQ地图使用
BD09坐标系:百度坐标系,GCJ02坐标系加密后的坐标系

可以调用你所使用的地图的服务商提供的坐标系转换接口进行坐标转换。

Android 获取位置信息相关推荐

  1. android 获取当前坐标,Android获取位置信息的方法

    本文实例为大家分享了Android获取位置信息的具体代码,供大家参考,具体内容如下 1.位置服务的简介:位置服务,英文翻译为Location-Based Services,缩写为LBS,又称为定位服务 ...

  2. Android 获取位置信息(经纬度)(附代码)

    获取位置信息主要通过GPS和网络位置两种方法,优先级还是GPS,有点就不多说了,下面说一下我做的方法及附代码,有疑问可在下方留言. 思路便是GPS优先,但在GPS信号弱的情况下采取拿网络位置来弥补的方 ...

  3. 对Android GPS获取位置信息的新研究.

    前段时间略看了Android 的GPS API,就冒然发布了一片博文,现在再回过头来看看,确实有不少不足甚至错误.这篇算做补充和纠正吧. 1.要想获取位置信息,需要在手机设置中将"位置与安全 ...

  4. Android 使用LocationLstenser获取位置信息

    第一步: 注册一个LocationLstenser: this.locationManager=(LocationManager)this.getSystemService(Context.LOCAT ...

  5. Android位置服务介绍,并介绍如何通过LocationManager对象获取位置信息

     1.位置服务,英文翻译为Location-Based Services,简称LBS,又称为定位服务或基于位置的服务,融合了GPS定位.移动通信.导航等多种技术,提供与空间位置相关的综合应用服务, ...

  6. Android 获取定位权限,获取位置信息(国家、地区、经纬)

    第一步 授权 在 AndroidManifest.xml 中加上位置信息权限按需要添加 <uses-permission android:name="android.permissio ...

  7. Android 打开 GPS 导航并获取位置信息

    原文地址为: Android 打开 GPS 导航并获取位置信息 最近在做一个 Android 项目,需要用到GPS获取位置信息,从 API 查了一下,发现获取位置信息仅需极其简单的一句即可: getL ...

  8. Android开发:基于原生API获取位置信息、卫星信号个数及参与定位的卫星个数

    目录 概述 权限申请及开启GPS 调用原生API进行定位 获取设备收到的卫星信号个数 获取用于定位的卫星信号个数 成果图 概述 最近在做室内外无缝定位的相关demo,室外定位中,GNSS定位方法具有精 ...

  9. 微信公众号,JS-SDK获取位置信息,并调起第三方地图App导航

    微信公众号关联网页获取位置信息,可以参照<微信公众平台技术文档>-> 微信JS-SDK说明文档,官方链接地址:https://mp.weixin.qq.com/wiki?t=reso ...

最新文章

  1. ATS 5.3.0日志字段分析(续)
  2. seaborn使用jointplot函数为散点图添加边缘图、添加回归线、为边缘直方图添加密度曲线、使用ratio函数突出显示边缘图形(focus on Marginal Plot )
  3. targetSdkVersion
  4. python接口测试-认识GET请求
  5. WPF 实现验证码控件
  6. 《MySQL——增删改查以及常用语法》
  7. react(94)--时间搜索传值规范
  8. 64位win8系统加64位sql server 2008,性能提高了好多
  9. JAVA程序员的学习网站(2)
  10. 低版本 android 软件下载,纳米盒旧版本下载-纳米盒旧版下载4.1安卓版-西西软件下载...
  11. 腾讯QQ浏览器 10.0.932.400 正式版
  12. 【Unity Shaders】ShadowGun系列之二——雾和体积光
  13. STM32F103_study64_The punctual atoms(Simulator and downloader)
  14. 单表七千六百万数据量(oracle)进行实时汇总,sql很慢客户不能忍一下,该怎么办?
  15. 解决微信大字体下H5布局混乱
  16. Java并发编程工具类:CountDownLatch、CyclicBarrier、Semaphore
  17. 使用OpenCV调用摄像头检测人脸并截图-Python
  18. jsch session(ssh)
  19. C#运控框架 雷赛运动控制 DMC系列 运动控制项目 C#源码
  20. 条款20 宁以pass-by-reference-to-const替换pass-by-value

热门文章

  1. rf 433/868MHZ sub-1g 无线通信知识系列(1):RF信道冲突
  2. 从零搭建Spring Boot脚手架(4):手写Mybatis通用Mapper
  3. netty pipeline 执行顺序解读
  4. 巴山铁路工人吴磊自学在云上开发文件签报系统,把紧急通知及时送到铁路工人手中,确保行车安全...
  5. Multipart/form-data文件上传简介
  6. c#中regex的命名空间_C#_详解C#正则表达式Regex常用匹配,使用Regex类需要引用命名空间 - phpStudy...
  7. 利用一个竞态漏洞root三星s8的方法
  8. aecmap快捷键_ArcGIS编辑操作的常用快捷键
  9. 在arcengine中实现图片预览
  10. 如何屏蔽迅雷9右侧广告首页