Android中的定位通过LocationManager实现

LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

获取位置信息

Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
geocoder.getFromLocation(location.latitude, location.longitude, 1)

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 10F, listener)

getLastKnownLocation获取的是上次的定位数据,在定位开关切换后(关闭又打开)会返回空,Location类包含定位数据,比如经纬度,速度之类的。通过Geocoder可以将经纬度逆编码成地址,获取国家,省份,城市之类的信息。requestLocationUpdates或许改名叫observeLocationUpdates更好,是注册地址更新的监听器,传入最小的更新间隔和距离,需要手动移除。

Android定位主要需要关注四个点,定位开关,定位精度(权限),定位方式,定位场景。

定位开关

检测定位开关状态

LocationManagerCompat.isLocationEnabled(locationManager)

点进去可以看到下面的代码,Android 9 以后使用系统API判断,Android 9 以下判断两种定位方式(GPS和网络)是否有至少一种可用。

if (VERSION.SDK_INT >= VERSION_CODES.P) {return locationManager.isLocationEnabled();
} else {return locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)|| locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}

如果定位开关没有打开,需要跳转到设置内由用户手动开启,跳转Intent如下

startActivityForResult(Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS), 233)

定位精度

定位精确度其实也跟定位方式有关,主要分两种。
粗略定位,需要android.permission.ACCESS_COARSE_LOCATION权限,精确度大致会精确到 3 平方公里(约 1.2 平方英里)以内。
精确定位,需要android.permission.ACCESS_FINE_LOCATION权限,
通常可以精确到 50 米(160 英尺)以内,有时甚至可以精确到几米(10 英尺)以内。
以上两个权限需要在AndroidManifest上声明,并在运行时动态申请,与一般的动态申请权限一致。除非只需要粗略定位,否则需要同时申请两个权限。根据官方文档Android12及以后用户可以选择只授予应用粗略定位权限,如果这时只申请精确定位权限,那么系统会忽略权限请求,同时会在LogCat中打印日志

ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.

定位方式

可通过getProviders方法获取定位方式列表,true表示只返回可用的定位方式。getBestProvider可以用来添加约束,比如需要多大的定位精度之类的,返回推荐的定位方式。

locationManager.getProviders(true);
locationManager.getBestProvider(new Criteria(),true);

GPS定位

使用LocationManager.GPS_PROVIDER ,定位精度较高,需要android.permission.ACCESS_FINE_LOCATION权限。

网络定位(CellID, WiFi MACID)

网络定位模式(基站、wifi网络)、精度较低(1000米)、无海拔高度、初始定位速度快、耗电低。
使用LocationManager.NETWORK_PROVIDER 需要android.permission.ACCESS_COARSE_LOCATION权限。

被动定位

被动定位方式,精度取决于定位信息提供方。比较明显,就是用现成的,不主动请求位置信息,当其他应用使用定位更新了定位信息,系统会保存下来,该应用接收到消息后直接读取就可以了。
使用LocationManager.PASSIVE_PROVIDER 需要android.permission.ACCESS_FINE_LOCATION权限。

融合定位

结合上述三种定位方式提供定位,Android12之前Google Play Service提供的功能,Android12之后加入SDK。
使用LocationManager.FUSED_PROVIDER 需要android.permission.ACCESS_FINE_LOCATION权限。

定位场景

前台定位

前台定位就是一般情况下的定位,无需额外的权限。

后台定位

后台定位属于比较危险的行为,Google Play Store有相关的政策要求。Android10后新增了一个动态权限android.permission.ACCESS_BACKGROUND_LOCATION,这个权限应该在获得上述的关于精确度的权限后单独请求。主要是根据应用需求一开始只请求前台位置权限,在需要的时候再请求后台位置权限。Android11之后如果一起请求前后台权限(定位权限和后台定位权限),系统会忽略该请求,且不会向您的应用授予其中的任一权限。

关联拓展信息

android.permission.ACCESS_MOCK_LOCATION
需要接受假位置信息时(比如用于测试)的权限,API23已经移除。

android.permission.ACCESS_MEDIA_LOCATION
读取多媒体文件的定位信息,比如图片可能附带地址信息,需要此权限才能读取。Android 10加入,需要动态申请

参考链接

Android官方文档

Android定位简记相关推荐

  1. android 定位的几种方式介绍

    [地理位置] android 定位的几种方式介绍 开发中对于地图及地理位置的定位是我们经常要用地,地图功能的使用使得我们应用功能更加完善,下面 www.androidkaifa.com 总结了一下网络 ...

  2. android 定位服务 耗电吗,关于Android的定位服务

    今天因为工作须要,把以前编写的一个GPS测试法度榜样拿出来从新修改了一下.这个法度榜样说起来竽暌剐些汗青了,是我11年编写的,那时刻学了Android开辟没多久,算是一个实验性的作品.如今工作须要,从 ...

  3. 定位 android8.1.0,8.1.2 实现Android定位(2)

    8.1.2  实现Android定位(2) (3)实现定位管理器 可以使用Context.getSystemService()方法实现定位管理器功能,并传入Context.LOCATION_ SERV ...

  4. android 定位 广播,android - 如何触发广播接收器在GPS开启/关闭? - SO中文参考 - www.soinside.com...

    如何触发广播接收器在GPS开启/关闭? 问题描述 投票:35回答:5 public class BootReceiver extends BroadcastReceiver { @Override p ...

  5. 利用百度地图Android定位SDK获取经纬度

    环境的搭建(参考上一次的文章) 百度地图Android定位SDK的使用 2.在Android studio里设计程序来获取经纬度 界面布局activity_main.xml文件的源代码: <?x ...

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

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

  7. Android定位功能(二)

    在前文Android定位功能(一)中,已经大致介绍了一下在Android平台中,和定位功能相关的类,并举例获取了位置信息.但是前文是基于Criteria定制了一个标准,通过getBestProvide ...

  8. 七、Android定位与拨打电话、发送短信

    Android定位与拨打电话.发送短信 前言 项目目录 1.定位 (1)代码LocationActivity.activity_location (2)权限 2.拨打电话.发送短信 3.MainAct ...

  9. Android定位方式和测试方法,定位方式(d16)

    一,回顾, ①selector和xpath的区别,selector是解析的html,xpth是解析的xml,所以使用selector比使用xpath快, ②定位元素的单数和复数,当使用单数定位不到元素 ...

最新文章

  1. 小众编程语言同样值得你关注
  2. Fabio技术手册(1):概述和快速上手
  3. 「AI在左,营销在右」互动营销创意破圈,这事儿不难
  4. Windows版Qt
  5. 图像处理之积分图应用二(快速边缘保留滤波算法)
  6. (12)Zynq CAN控制器介绍
  7. html5 box布局,使用Flexbox打造响应式网页网格布局
  8. asp获取计算机mac,ASP获取客户端MAC地址(源代码)
  9. 记录.NET Core部署到Linux之.NET Core环境搭建(1)
  10. 八 理解各种不同含义的new和delete
  11. 集合对象转json数组
  12. VUE3-Cesium(entity、primitive总结及材质的修改)
  13. 南京大学计算机专业复试面试,南京大学计算机CS专业复试超全PPT及真题、面试内部资料(离散编译上机面试)...
  14. Linux下查询外网IP地址方法集合
  15. 姓杨取名:杨姓女孩文雅有寓意的名字,真的是万里挑一
  16. Python 截屏 - lone112 - 博客园
  17. Asp.net core abp 无密码登录
  18. 【OI生涯】我学OI是为了什么?
  19. 【模板】高精度取余函数
  20. 双通道14位、500 MSPS采样率的AD9684 高速并行LVDS ADC接口介绍

热门文章

  1. safari浏览器如何打开开发者工具
  2. node-red templete节点设置地图
  3. 1042. 不邻接植花
  4. java实现裁剪算法代码_Cyrus-Beck图像裁剪算法归纳
  5. android基础面试题及答案,万字Android技术类校招面试题汇总
  6. LeetCode_每日一题 面试题 16.24. 数对和
  7. 液冷数据中心规模化扩张在即,曙光数科发布“冷平衡”战略
  8. PHP 递归寻找上下级DEMO
  9. Class文件格式实战:使用ASM动态生成class文件
  10. Appium 分布式selenium grid