1.概述

本文主要介绍android基站定位的基本思路,介绍了一些TelephonyManager中用到方法。最后简单说明google定位服务与android提供参数之间的联系。

2. 基站定位原理:

我们可以通过手机信号获取基站信息,然后调用第三方服务,再根据基站信息查找基站的经度纬度值。 尽管基站网络制式不同(cdma或gsm)所获取的基站信息也不一样,但用谷歌等一般这样的第三方定位服务都需要获得以下这些基站信息:

  1. MCC,Mobile Country Code,移动国家代码(中国的为460)。
  2. MNC,Mobile Network Code,移动网络号码(中国移动为0,中国联通为1,中国电信为2)。
  3. LAC,Location Area Code,位置区域码。
  4. CID,Cell Identity,基站编号。
  5. BSSS,Base station signal strength,基站信号强度。

3. Android基站信息api

获取网络服务商信息MNC&MCC

从系统服务中获取TelephonyManager:

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

TelephonyManager#getNetworkOperator方法获取目前注册网络MCC+MNC信息,一般是5-6位的字符串,前3位为MCC,后面的是MNC。
用户必须在该网络注册才能获取到信息,对于cdma网络而言可能会不靠谱,因此用TelephonyManager#getPhoneType来判断手机支持的网络制式。

String operator = telephonyManager.getNetworkOperator();
String mcc = operator.substring(0, 3);
String mnc = operator.substring(3);

TelephonyManager#getSimOperator方法获取Sim卡的MCC+MNC信息
SM卡状态必须处于SIM_STATE_READY,用TelephonyManager#getSimState判断Sim卡状态。

TelephonyManager#getPhoneType 获取手机支持网络制式
一般就GSM、CDMA两种,如果没有获取到则是NONE。

TelephonyManager#getNetWorkType 获取网络类型
用以区分移动2g,电信4g等更具体的网络。

获取当前连接基站信息LAC、CID

由于电信用的是cdma制式网络,移动和联通用的gsm网络,这两种网络基站信息封装类在android中是不同的,cdma要用CdmaCellLocation,gsm要用GsmCellLocation。
从TelephonManager获取基站定位信息CellLocation,其中封装了需要的CID和LAC等信息。

if(telephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA){CdmaCellLocation cdmaCellLocation = (CdmaCellLocation)
telephonyManager.getCellLocation();int cid = cdmaCellLocation.getBaseStationId(); //获取cdma基站识别标号 BIDint lac = cdmaCellLocation.getNetworkId(); //获取cdma网络编号NIDint sid = cdmaCellLocation.getSystemId(); //用谷歌API的话cdma网络的mnc要用这个getSystemId()取得→SID
}else{GsmCellLocation gsmCellLocation = (GsmCellLocation) telephonyManager.getCellLocation();int cid = gsmCellLocation.getCid(); //获取gsm基站识别标号int lac = gsmCellLocation.getLac(); //获取gsm网络编号
}

获取邻近基站信号强度信息BSSS

每个基站信息封装在具体CellInfo子类中,有CellInfoCdma、CellInfoGsm等。CellInfoGsm中又封装了2个函数,分别用来返回基站识别信息(CellIdentityGsm类)和基站信号强度信息(CellSignalStrengthGsm类)。

TelephonyManager#getAllCellInfo方法返回所有能检测到的基站信息(包括连接的基站信息),而且返回的信息更详细。而TelephonyManager#getNeighboringCellInfo方法不包括连接的基站信息,返回基站信息是经过处理的,不加以cdma或gsm区分。一般用getAllCellInfo方法。

List<CellInfo> infoLists = telephonyManager.getAllCellInfo();for (CellInfo info : infoLists) {CellInfoCdma cellInfoCdma = (CellInfoCdma) info;CellIdentityCdma cellIdentityCdma = cellInfoCdma.getCellIdentity();CellSignalStrengthCdma cellSignalStrengthCdma = cellInfoCdma.getCellSignalStrength();int strength = cellSignalStrengthCdma.getCdmaDbm();int cid = cellIdentityCdma.getBasestationId();// 处理 strength和id数据}

CellSignalStrengthCdma类中封装了各种信号处理方法,用来返回不同标准的信号强度。CellIdentityCdma类封装了Cdma基站特有的识别信息,比如能通过CellIdentityCdma#getLongitude()获取Cdma基站的经纬度。CellIdentityGsm类封装Gsm基站信息,能获取MCC、MNC、CID和LAC。

4. Android 基站信息监听器

PhoneStateListener类是一个监听类,重写其中方法实现对基站信息变化的监听。

private PhoneStateListener phoneStateListener; //定义监听器
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CELL_LOCATION); //注册监听器,设定不同的监听类型
//设置监听器方法
private void setPhoneStateListener(){phoneStateListener = new PhoneStateListener(){@Overridepublic void onCellLocationChanged(CellLocation location){}@Overridepublic void onSignalStrengthsChanged(SignalStrength signalStrength) {}@Overridepublic void onCellInfoChanged(List<CellInfo> cellInfo) {}}
}

这里主要用到的三个回调函数:

  • onCellLocationChanged 当cellLocation变化时会调用,传入cellLocation类型,需要根据具体的网络制式向下转型(CdmaCellLocation或GsmCellLocation)。

  • onSignalStrengthsChanged 传入的是SignalStrength类型,这个类型和CellStrength类没关系,是一个重新写的类。其中有自定义的一些方法返回信号强度,有getCdmaDbm()、getGsmSignalStrength()。Coma和gsm类型都封装在一起,需要调用额外的方法isGsm()。

  • onCellInfoChanged 传入参数为CellInfo,维护一个CellInfo列表,有检测到的基站变动都会调用。方法跟TelephonyManager#getAllCellInfo()的使用类似。

google定位服务API 说明

移动电话基站Json

google的基站定位服务所需参数:

"homeMobileCountryCode": 310,  //即MCC"homeMobileNetworkCode": 410,   //即MNC"radioType": "gsm","carrier": "Vodafone","considerIp": "true","cellTowers": [// See the Cell Tower Objects section below.]

cellTower就是之前说的信号强度BSSS参数,需要一个列表来记录周围基站参数。cellTower并不是必要参数,但是给了可以增加定位精确度。

{"cellTowers": [{"cellId": 42,"locationAreaCode": 415,"mobileCountryCode": 310,"mobileNetworkCode": 410,"age": 0,"signalStrength": -60,"timingAdvance": 15}]
}

CellTowers必填字段:

  • cellId(必填): GSM用的是CID,CDMA 网络使用的是基站 ID (BID)。WCDMA 网络使用 UTRAN/GERAN 基站标识 (UC-Id),这是一个 32 位的值,由无线网络控制器 (RNC) 和基站 ID 连接而成。在 WCDMA 网络中,如果只指定 16 位的基站 ID 值,返回的结果可能会不准确。
  • locationAreaCode(必填):GSM 和 WCDMA 网络的位置区域代码 (LAC)。CDMA 网络的网络 ID (NID)。
  • mobileCountryCode(必填):移动电话基站的移动国家代码 (MCC)。
  • mobileNetworkCode(必填):移动电话基站的移动网络代码。对于 GSM 和 WCDMA,这就是 MNC;CDMA 使用的是系统 ID (SID)。

Android基站定位详解相关推荐

  1. Android GPS定位详解

    自己项目用到了 ,懒得写,偶尔发现这个写的不错,就存下来了 一.LocationManager LocationMangager,位置管理器.要想操作定位相关设备,必须先定义个LocationMana ...

  2. Android学习笔记——Android 签名机制详解

    Android 签名机制详解 近期由于工作需要在学习 Android 的签名机制,因为没有现成资料,只能通过开发者文档和阅读博客的方式对 Android 签名机制进行大致了解.过程中查阅到的资料相对零 ...

  3. Android系统目录结构详解

    Android系统基于linux内核.JAVA应用,算是一个小巧精致的系统.虽是开源,但不像Linux一般庞大,娇小可亲,于是国内厂商纷纷开发出自己基于Android的操作系统.在此呼吁各大厂商眼光放 ...

  4. 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...

    本节书摘来自异步社区<Android游戏开发详解>一书中的第1章,第1.6节函数(在Java中称为"方法"更好),作者 [美]Jonathan S. Harbour,更 ...

  5. JMessage Android 端开发详解

    JMessage Android 端开发详解 目前越来越多的应用会需要集成即时通讯功能,这里就为大家详细讲一下如何通过集成 JMessage 来为你的 App 增加即时通讯功能. 首先,一个最基础的 ...

  6. 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.5节良好的Java程序代码编写风格,作者 陈会安,更多章节内容可以访问云栖社区"异步社区&quo ...

  7. Android事件流程详解

    Android事件流程详解 网络上有不少博客讲述了android的事件分发机制和处理流程机制,但是看过千遍,总还是觉得有些迷迷糊糊,因此特地抽出一天事件来亲测下,向像我一样的广大入门程序员详细讲述an ...

  8. Android Studio 插件开发详解二:工具类

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112856 本文出自[赵彦军的博客] 在插件开发过程中,我们按照开发一个正式的项 ...

  9. 《Android游戏开发详解》一2.16 区分类和对象

    本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.16节,作者: [美]Jonathan S. Harbour 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社 ...

  10. Android Framework系统服务详解

    Android Framework系统服务详解 操作环境 系统:Linux (Ubuntu 12.04) 平台:高通 Android版本:5.1 PS: 符号...为省略N条代码 一.大致原理分析 A ...

最新文章

  1. php绑定邮箱地址链接,php完美匹配邮箱、链接地址和电话号码
  2. 卸载重装svn后原来项目不受管理,版本不对应还是,升级工作副本解决?
  3. 《 自动化测试最佳实践:来自全球的经典自动化测试案例解析》一一1.6 正确度量...
  4. 《嵌入式linux应用程序开发标准教程》笔记——7.进程控制开发
  5. voinc vue实现级联选择
  6. 部分编程错误小集-15.04
  7. 数据科学入门与实战:玩转pandas之六时间序列
  8. 程序—java年月日转换
  9. TCP实现原理(报文段结构+可靠数据传输+流量控制)
  10. 深夜读萧红《呼兰河传》
  11. nebula graph调研
  12. python中对fits文件读取和保存
  13. 全球首个大规模虐童图像数据库!标记15万图像、20类信息,自动判断图片是否违法​...
  14. Xamarin for mac学习笔记(一)
  15. 职称计算机Word2003是考什么,职称计算机考试:word2003考点
  16. Android 页面销毁、重建与数据恢复
  17. WIN7远程桌面连接方法!
  18. goland 工具 破解码
  19. 绘制微型计算机系统组成结构图手绘,思维导图简单画法,电脑绘制和手绘一文精通...
  20. 想了解工业大数据,不得不看的一篇

热门文章

  1. java格林尼治时间_Java日期时间使用总结
  2. 如何免费下载百度指数数据
  3. 基本if选择结构以及random
  4. Java XXE 漏洞
  5. CC2650 入手资料总结(转)
  6. python下载小说
  7. 别让Java对象逃逸(Object Escape)
  8. python读取xls文件_用python脚本 从xls文件中读取数据
  9. 实验三mysql查询_实验三 数据库的查询实验
  10. 什么是DNS,FTP,HTTP,DHCP及用途