虽然现在第三方的定位非常强大,非常方便,但是我们在只需要很简单的定位,且不想用第三方的时候,我们可以自己动动手,基于GPS卫星定位和LBS基站定位的方式获取当前位置。

GPS定位

1.权限申请

首先我们需要申请权限,6.0以下系统在mainfest文件申请,因为需要通过网络获取经纬度对应的详细地址,所以需要INTERNET权限。代码如下:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/> 

6.0以上系统需要在Activity里面动态申请权限,首先判断定位权限是否被用户允许,如果没有允许,就需要申请定位权限。

//检查定位权限是否已经允许
if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED) {//申请定位权限ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},PERMISSIONS_FINE_LOCATION);
} else {//定位权限已经被允许
}

当申请权限的时候,会弹出提示用户是否允许申请的权限:

2.通过LocationManager获取定位

LocationManager的使用还是非常简单的,首先拿到他的实例,然后通过public void requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener);方法设置监听并请求定位。

LocationManager locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);/*** GPS定位监听器*/
LocationListener locationListener = new LocationListener() {/*** 位置信息变化时触发*/@Overridepublic void onLocationChanged(Location location) {//位置信息变化时触发LogUtils.i(TAG, "纬度:" + location.getLatitude() + "  经度:" + location.getLongitude()+ "  海拔:" + location.getAltitude() + "  时间:" +TimeUtils.milliseconds2String(location.getTime(), TimeUtils.TimeFormat.yyyy_MM_dd_HH$mm$ss));GPSLocation.this.location = location;}/*** GPS状态变化时触发*/@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {LogUtils.i(provider);switch (status) {//GPS状态为可见时case LocationProvider.AVAILABLE:LogUtils.i(TAG, "当前GPS状态为可见状态");break;//GPS状态为不在服务区case LocationProvider.OUT_OF_SERVICE:LogUtils.i(TAG, "当前GPS状态为不在服务区状态");location = null;break;//GPS状态为暂停服务时case LocationProvider.TEMPORARILY_UNAVAILABLE:LogUtils.i(TAG, "当前GPS状态为暂停服务状态");location = null;break;}}/*** 被用户开启后调用*/@Overridepublic void onProviderEnabled(String provider) {LogUtils.i(TAG, "用户打开了GPS");}/*** 被用户关闭后调用*/@Overridepublic void onProviderDisabled(String provider) {LogUtils.i(TAG, "用户关闭了GPS");location = null;}
};/*** 绑定监听* 参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种,前者是GPS,后者是GPRS以及WIFI定位* 参数2,位置更新的最小时间间隔,以毫秒为单位* 参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息,单位米* 参数4,监听* 备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新*/
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10 * 1000, 100, locationListener);

通过上面的代码我们可以看到,定位的信息都是通过LocationListener监听回调的onLocationChanged(Location location)方法的参数传递回来,Location里面保存了经纬度以及海拔等信息。如果我们需要将经纬度转换为详细地理位置,则需要再想办法;
通过免费接口http://api.cellocation.com/regeo/?lat=34.232525&lon=108.91308166666667&output=json 可以将经纬度以详细地理位置返回给我们。

LBS基站定位

同样需要权限许可,有上面的权限即可

基站定位需要LBS数据仓库提供支持,我这里使用http://www.cellocation.com/interfac/提供的免费接口。
基站定位需要
* MCC: 国家代码:中国代码 460
* MNC,移动设备网络代码(Mobile Network Code,MNC),中国移动 = 00,中国联通 = 01, 中国电信 = 03 05 11
* LAC,Location Area Code,位置区域码;
* CID,Cell Identity,基站编号,是个16位的数据(范围是0到65535)。

所以我们先将这几个参数获取到,通过TelephonyManager可以获取我们需要的基站信息。具体代码如下:

/***  基站信息*  MCC: 国家代码:中国代码 460*  MNC,移动设备网络代码(Mobile Network Code,MNC),中国移动 = 00,中国联通 = 01, 中国电信 = 03 05 11*  LAC,Location Area Code,位置区域码;*  CID,Cell Identity,基站编号,是个16位的数据(范围是0到65535)。*/
public static class StationInfo{private int MCC;private int MNC;private int LAC;private int CID;get and set...
}/*** 获取基站信息*/
private StationInfo getCellInfo() {StationInfo stationInfo = new StationInfo();/** 调用API获取基站信息 */TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);if (!hasSimCard(mContext)){ //判断有没有sim卡,如果没有安装sim卡下面则会异常Toast.makeText(mContext,"请安装sim卡",Toast.LENGTH_LONG).show();return null;}String operator = telephonyManager.getNetworkOperator();LogUtils.e("operator","operator="+operator);int mcc = Integer.parseInt(operator.substring(0, 3));int mnc = Integer.parseInt(operator.substring(3));//参考http://www.cellocation.com/interfac/int cid = 0;int lac = 0;if (mnc == 11 || mnc == 03 || mnc == 05){  //03 05 11 为电信CDMACdmaCellLocation location = (CdmaCellLocation) telephonyManager.getCellLocation();//这里的值可根据接口需要的参数获取cid = location.getBaseStationId();lac = location.getNetworkId();mnc = location.getSystemId();    } else {GsmCellLocation location = (GsmCellLocation) telephonyManager.getCellLocation();cid = location.getCid();lac = location.getLac();}/** 将获得的数据放到结构体中 */stationInfo.setMCC(mcc);stationInfo.setMNC(mnc);stationInfo.setLAC(lac);stationInfo.setCID(cid);return stationInfo;
}

接下来将获取到的 MCC, MNC, LAC, CID 数据通过接口请求获取经纬度和详细位置:

/*** 通过此方法请求定位信息*/
public void request() {String url = "http://api.cellocation.com/cell/?mcc=%1$s&mnc=%2$s&lac=%3$s&ci=%4$s&output=json";StationInfo info = getCellInfo();if (info == null) {listener.onFailed();return;}LogUtils.i(info.toString());url = String.format(url, info.getMCC(), info.getMNC(), info.getLAC(), info.getCID());//通过网络请求获取经纬度和详细位置getLocation(url);
}

下面我们看一下效果图:

其实我这里测试LBS定位比GPS定位出来的详细信息更加准确,GPS定位超级费电,可能是我这手机比较low,打开一会儿手机就发热,电池掉的也飞快。

GIT地址: https://code.csdn.net/chengliang0315/locationtest.git

压缩包 : http://download.csdn.net/detail/chengliang0315/9724818

Android定位--GPS定位与LBS基站定位相关推荐

  1. GPS定位与IP地址定位有何不同?

    随着数字化时代到来,智能终端快速普及与应用,人们在生活和工作中越来越多地应用到位置服务,从导航查询,到侦查搜救,位置核验等应用十分广泛.万物互联的到来,更是对位置服务的要求日益提高,而位置服务的核心要 ...

  2. GPS定位与IP地址定位

    在日常生活中,常用的定位技术包括GPS定位.基站定位与IP地址定位​.WIFI定位. 关于GPS定位 GPS(Global Positioning System,全球定位系统)起始于1958年美国军方 ...

  3. LBS基站定位和GPS卫星定位对比

    备注: 本文为网上找到的一个word文档,看了之后,觉得总结相当不错,现在把其贴出来共享!同时感谢原作者无私的奉献精神! 位置定位大体上可以分为两大类: 1. GPS(Global Positioni ...

  4. wifi rssi 计算 距离_SKYLAB:蓝牙室内定位与WiFi室内定位的对比分析

    一.Wi-Fi室内定位技术 简单来说,Wi-Fi室内定位技术采用的是三点定位的方式,即通过移动接收设备以及三个Wi-Fi网络接入点的无线信号来确定移动接收设备的位置.由于三个Wi-Fi网络接入点距离移 ...

  5. mysql gprs 程序_基于STM32控制的GPS定位与GPRS发送数据(程序源码)

    一个用STM32控制的GPS与GPRS程序,GPS使用ublox的GPS,GPRS使用SIM800E,主要实现每隔几分钟(间隔时间由服务器设定,默认5分钟)将模块的定位结果数据发送到服务器中,服务器返 ...

  6. Android之手机定位方式(GPS定位,网络定位,基站定位)

    从前天学习GPS定位开始,这两天断断续续都在学习Android的三种基本定位方式. 1.GPS定位(基本Android机上都会有,缺点是必须在空旷的地方才有用) 2.网络定位(NetWork,这个很多 ...

  7. 定位技术GPS/A-GPS/LBS/WIFI定位介绍

    定位技术GPS/A-GPS/LBS/WIFI定位介绍 来源:本站整理 作者:08LR.CN 更新时间:2013年05月03日人气:本日:9 本周:19 本月:34 总数:2134 次 生活中,我们经常 ...

  8. android 手机 GPS定位

    欢迎转载,转载请注明出自:www.androidkaifa.com,安卓开发网            开发中对于地图及地理位置的定位是我们经常要用地,地图功能的使用使得我们应用功能更加完善,下面www ...

  9. GPS、WiFi、基站、AGPS几种定位原理介绍与区别

    定位器的原理: "三角定位法",知道了用户到三个固定点的距离,就能计算出用户的位置. 1.GPS GPS(Global Positioning System)即全球定位系统,它是由 ...

最新文章

  1. Python:阳光热线问政平台爬虫
  2. 大数据和数据库的理解文章收藏
  3. 3. SQL -- 存储过程
  4. java query接口_「软帝学院」Java零基础学习详解
  5. Cnblogs美化总结
  6. NLTK学习笔记(八):文法--词关系研究的工具
  7. Android学习点点滴滴之获取正在运行的进程
  8. 智能实验室-CHM浏览器(CHM Explorer) 2.0.0.200
  9. 深入探讨一下如何打断点
  10. 换行 输出txt_编程短文:Bash echo如何原生输出带空格的字符串而不换行
  11. java泛型与c 泛型,Java泛型代码编译与javac,失败与Eclipse Helios
  12. python物理模拟.pdf_用Python物理建模的第一本书终于来啦
  13. Nero11序列号 有效序列号
  14. react实战笔记172:navigate组件
  15. python linux 执行scp,python 使用标准库连接linux实现scp和执行命令
  16. 图像处理技术-基本运算
  17. 人力资源管理七大问题
  18. 小程序baes64转普通格式
  19. DC故障,在使用缓存登录的错误理解的解释
  20. 自律的程序员生活是什么样的?

热门文章

  1. 生产管理系统的功能模块
  2. install 11g2 rac for hpunix 11.31 error [INS-20802] update Inventory failed.
  3. xp系统打开itunes显示服务器失败,win7系统打开iTunes显示Apple Mobile Device Service无法启动怎么解决...
  4. 【Windows】Windows常用命令行操作及快捷方式
  5. Windows mobile模拟器上网的配置步骤
  6. 婚恋网想说爱你不容易
  7. armplayer/android6410/s3c6410/arm11 开发板+4.3寸TFT+22DVD
  8. 职场“29岁现象”:是继续打工还是创业?
  9. html修改链接文字颜色,html设置超链接字体颜色 html超链接的字体颜色怎么改
  10. 用python实现简单的飞机大战小游戏