Android 地理位置定位
Android官方提供的定位SDK
1.先在Manifest.xml中申请权限(targetSdkVersion 为23或者更高的需要动态申请权限)
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" /> <!-- 使用网络定位作为定位信息提供者时需要访问网络的权限 -->
2.调用Context的getSystemService()方法来获得LocationManager
LocationManager = mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE)
3.获取定位服务提供者LocationProvider
大体上,LocationManager有三种常用方法获得LocationProvider
1.获取所有Provider
List<String> providers = mLocationManager.getProviders(true);
2.根据指定条件来获取最接近的Provider,Criteria是过滤条件。
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);// 设置对电源的需求
String provider = mLocationManager.getBestProvider(crite, true);
3.LocationProvider getProvider(String name); 根据名称来直接获取指定的LocationProvider
String provider = mLocationManager.getProvider(LocationManager.GPS_PROVIDER);
有三种常用的provider是:
1. GPS_PROVIDER:
这个就是手机里有GPS芯片,然后利用该芯片向卫星请求定位当前的地理位置。但是对请求信号强度要求比较高,在室内GPS定位基本没用,百分之就是的可能获取的是null。
2. NETWORK_PROVIDER:
网络定位,通常是利用手机基站和WIFI节点的地址来大致定位位置。这种定位方式取决于将基站或WIFI节点信息翻译成位置信息的服务器的能力。但由于目前发部分Android手机没有安装google官方的location manager库,大陆网络也无法访问到google的服务器,自然该方法基本上没法实现定位。
3. PASSIVE_PROVIDER:
被动定位方式,读取其他应用保存的定位信息。当其它应用使用定位更新定位信息后,系统会被保存下来,被动定位就是读取的这些信息。如果系统中已经安装了百度地图、高德地图之类的应用,你只要使用他们定位过后,使用被动定位就可以拿到比较精确的定位信息了。局限性很大,依赖于别的应用。
4.获取provider提供的位置信息(注意:可能会返回null)
Location location = mLocationManager.getLocation(provider);
LocationManager还有几个常用方法:
Location getLastKnownLocation(String Provider)
根据provider获取最近的一个Location,如果本次定位失败,则返回上次定位成功时的位置信息,如果从未成功过则返回null
void requstLocationUpdates(String Provider,long minTime,long minDistance,LocationListener 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(),更新位置
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locationListener);
LocationListener 位置监听器
LocationListener locationListener = new LocationListener(){// 当位置发生变化时触发public void onLocationChanged(Location location) { Log.i(TAG, "时间:"+location.getTime()); Log.i(TAG, "经度:"+location.getLongitude()); Log.i(TAG, "纬度:"+location.getLatitude()); Log.i(TAG, "海拔:"+location.getAltitude()); } // 当GPS关闭时触发public void onProviderDisabled(String arg0) {} // 当GPS开启时触发public void onProviderEnabled(String arg0) { } // 当位置状态改变时触发public void onStatusChanged(String arg0, int arg1, Bundle arg2) { 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;}} };
可以通过一段代码遍历比较三种provider提供的位置信息,并返回精度较高的结果
List<String> providers = mLocationManager.getProviders(true);
Location location = null;
// 遍历三种定位方式的信息
for (String provider : providers) {// 获取定位信息 如果不为空则比较精度Location l = mLocationManager.getLastKnownLocation(provider);Log.d(TAG,"provider:" + provider + ",location == null:" + (l == null));if (l == null) {continue;}Log.d(TAG,"provider:" + provider + ",经度:" + l.getLongitude() + ",纬度:" + l.getLatitude());// 返回精度更高的定位信息if (location == null || l.getAccuracy() < location.getAccuracy()) {// Found best last known location: %s", l);location = l;}
}
return location;
LocationManager可以使用isProviderEnabled方法判断是否打开了gps
if(!mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){Log.i(TAG, "当前未打开GPS");
}
Android 地理位置定位相关推荐
- Android中WebView控件支持地理位置定位
Android WebView从assets中加载html5页面,实现地理位置定位,有需要的朋友可以参考下. 今天调研一个html5页面的定位问题,发现在手机浏览器上html5是可以实现定位的,但是在 ...
- HTML5 地理位置定位(HTML5 Geolocation)原理及应用 (调用GPS)
地理位置(Geolocation)是 HTML5 的重要特性之一,提供了确定用户位置的功能,借助这个特性能够开发基于位置信息的应用.今天这篇文章向大家介绍一下 HTML5 地理位置定位的基本原理及各个 ...
- Android 获取定位权限,获取位置信息(国家、地区、经纬)
第一步 授权 在 AndroidManifest.xml 中加上位置信息权限按需要添加 <uses-permission android:name="android.permissio ...
- Android的定位策略
原文作者:Google 原文地址:https://developer.android.com/guide/topics/location/strategies.html 原文版权:Creative C ...
- 浅析Android地理定位(GPS)
浅析Android地理定位(GPS) 定位权限 介绍一下定位相关的一些API LocationManager 位置提供器 requestLocationUpdates Geocoder Criteri ...
- android 定位服务和wifi,android WIFI定位和基站定位实现
android WIFI定位和基站定位实现 来源:互联网 作者:佚名 时间:2015-04-01 13:38 关于定位原理网上很多,这里就不多说了.下面说怎么实现的,直接贴代码如下:首先是Util类: ...
- 功耗大?定位精度差?如何优化Android原生定位
近期华为开发者论坛收到一位小伙伴提问: 我的应用app需要调用GPS的位置服务,已经将应用所需要的所有权限全部打开,而且使用了wifi和4G网络,手机的耗电管理和联网管理等设置也全部为app开放,但使 ...
- Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK
原文:Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...
- Android App定位和规避内存泄露方法研究
from:http://site.douban.com/android/widget/notes/350758/note/167481484/ 工作中刚好用到,网上搜到的,觉得不错,与大家分享 And ...
最新文章
- php 去除中英文空格,php去除字符串首尾中英文空格程序_PHP教程
- 别瞎学了,这几门语言要被淘汰了!
- java 从数据库取值_JAVA操作数据库--从一张表中取值,经过判断,然后插入另一张表中。...
- 如何建立一个完整的游戏AI
- Web Hacking 101 中文版 六、HTTP 参数污染
- Netty工作笔记0043---单Reactor多线程模式
- svm图像分割matlab,python实现
- Python安装shapely包出现WindowsError: [Error 126]解决方案
- Python中str()函数的使用(学习笔记)
- FTM的PWM、输入捕获、正交解码
- 清华计算机录取通知书,清华送出第一批录取通知书,这些被刷屏的学霸,有怎样的成长密码...
- SDNU 1014.书的页码问题
- php smtp发送邮件
- 数字验证码识别完成自动化登录
- 重庆师范计算机录取分数线,重庆师范大学历年录取分数线
- 用友OA漏洞学习——test.jsp SQL注入漏洞
- 零基础教师成功转型数据分析师,它功不可没
- Netty是什么?Netty的优势
- AspectJ in Action(2)
- 首发!小牛电动股权巨震:李一男、胡依林大幅减持,纪源资本退出