Android获取定位信息LacCi值_lac ci-程序员宅基地

技术标签: Android填坑记  

简介

LAC/CI值常用作基站定位,基站定位是指手机发射基站根据与手机的距离来计算手机坐标地理位置的一种功能,基站定位一般应用于手机用户。

LAC:location area code 位置区码 (移动通信系统中),是为寻呼而设置的一个区域,覆盖一片地理区域,初期一般按行政区域划分(一个县或一个区),现在很灵活了,按寻呼量划分。当一个LAC下的寻呼量达到一个预警门限,就必须拆分。 为了确定移动台的位置,每个GSMPLMN的覆盖区都被划分成许多位置区,位置区码(LAC)则用于标识不同的位置区。一个位置区可以包含一个或多个小区,小区即为CI。

手机基站定位服务又叫做移动位置服务(LBS服务),它是通过电信移动运营商的网络(如GSM网)获取移动终端用户的位置信息(经纬度坐标),在电子地图平台的支持下,为用户提供相应服务的一种增值业务。
不同型号的硬件,查询基站定位功能发送的AT指令也是不一样。
发送AT指令:@DTU:0000:GPS?
返回的坐标值:@DTU:0000:GPS?
+GPS: Lac:0x3910,CellId:0xEC7D
其中的0X3910为LAC(小区号),0XEC7D为CID(基站号)。
把座标值输入到网站 www.cellid.cn,可以自动输出经纬度、地址名称。
当然也可以通过Webservice请求到相应的地图网站(高德地图、百度地图均可),然后网站会自动返回带有经纬度的信息。

要使用基站定位接口,须在网络上找一个解析。定位精度最终取决于当地基站的密度。城市大概50到150米,城郊大概100到300米,乡村大概200到2000米,偏远地区由于基站的密度太少,所以就会很差。

开始

权限

了解了其中的作用,就开始使用。第一步就是添加权限。因为主要用于定位。所以所需要的权限也都类属与定位权限。首先在AndroidManifest.xml文件里添加权限。

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

获取

因为各个运营商之间采用的技术不尽相同,所以获取方式也不太一样。国内三大运营商的获取方式如下:

移动,联通:

TelephonyManager tel = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
CellLocation cel = tel.getCellLocation(); 
int nPhoneType = tel.getPhoneType();
//移动联通 GsmCellLocation
if (nPhoneType == 2 && cel instanceof GsmCellLocation) {
    
	GsmCellLocation gsmCellLocation = (GsmCellLocation) cel;
	int nGSMCID = gsmCellLocation.getCid();
	if (nGSMCID > 0) {
    
		if (nGSMCID != 65535) {
    
			this.cell = nGSMCID;
			this.lac = gsmCellLocation.getLac();
		}
	}
}

电信获取方式:

TelephonyManager tel = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
CellLocation cel = tel.getCellLocation(); 
int nPhoneType = tel.getPhoneType();
//电信   CdmaCellLocation
if (nPhoneType == 2 && cel instanceof CdmaCellLocation) {
    
	Log.e("电信", "-----------------》电信");
	CdmaCellLocation cdmaCellLocation = (CdmaCellLocation) cel;
	sid=cdmaCellLocation.getSystemId();
	nid=cdmaCellLocation.getNetworkId();
	bid=cdmaCellLocation.getBaseStationId();
}

扩展

知识扩展

在andorid上面要获取手机网络信息一般要调用TelephonyManagerl类来获取相关信息。

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

eNB E-UTRAN Node B 为LTE系统中E-UTRAN的组成部分

计算eNB的方式是 ci = eNB*256+cid

代码

获取TelephonyManager + 获取小区信息

telephonymanager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
// 先获取小区信息

// This method was deprecated in API level 23.
// Use (@link getAllCellInfo} which returns a superset of the information from NeighboringCellInfo.
StringBuilder str = new StringBuilder();
//获取小区信息
List<CellInfo> cellInfoList = telephonymanager.getAllCellInfo();
str.append("小区信息:"+"\n");
int index = 0;
for (CellInfo cellInfo : cellInfoList)
{
    
    //获取所有Lte网络信息
    if (cellInfo instanceof CellInfoLte)
    {
    
        str.append("["+index+"]==CellInfoLte"+"\n");
        if(cellInfo.isRegistered()){
    
            str.append("isRegistered=YES"+"\n");
        }
        str.append("TimeStamp:"+cellInfo.getTimeStamp()+"\n");
        str.append(((CellInfoLte)cellInfo).getCellIdentity().toString()+"\n");
        str.append(((CellInfoLte)cellInfo).getCellSignalStrength().toString()+"\n");

    }
    //获取所有的cdma网络信息
    if(cellInfo instanceof CellInfoCdma){
    
        str.append("["+index+"]==CellInfoCdma"+"\n");
        if(cellInfo.isRegistered()){
    
            str.append("isRegistered=YES"+"\n");
        }
        str.append("TimeStamp:"+cellInfo.getTimeStamp()+"\n");
        str.append(((CellInfoCdma)cellInfo).getCellIdentity().toString()+"\n");
        str.append(((CellInfoCdma)cellInfo).getCellSignalStrength().toString()+"\n");
    }
    //获取所有的Gsm网络
    if(cellInfo instanceof CellInfoGsm){
    
        str.append("["+index+"]==CellInfoGsm"+"\n");
        if(cellInfo.isRegistered()){
    
            str.append("isRegistered=YES"+"\n");
        }
        str.append("TimeStamp:"+cellInfo.getTimeStamp()+"\n");
        str.append(((CellInfoGsm)cellInfo).getCellIdentity().toString()+"\n");
        str.append(((CellInfoGsm)cellInfo).getCellSignalStrength().toString()+"\n");
    }
    //获取所有的Wcdma网络
    if(cellInfo instanceof CellInfoWcdma){
    
        str.append("["+index+"]==CellInfoWcdma"+"\n");
        if(cellInfo.isRegistered()){
    
            str.append("isRegistered=YES"+"\n");
        }
        str.append("TimeStamp:"+cellInfo.getTimeStamp()+"\n");
        str.append(((CellInfoWcdma)cellInfo).getCellIdentity().toString()+"\n");
        str.append(((CellInfoWcdma)cellInfo).getCellSignalStrength().toString()+"\n");
    }
    index++;
}

获取手机的位置,实现定位

CellLocation location = telephonymanager.getCellLocation();
if (location != null && location instanceof GsmCellLocation) {
    
    GsmCellLocation l1 = (GsmCellLocation) location;
    str.append("使用网络:" + "Gsm" + "\n");
    str.append("cid"+l1.getCid()+ "\n");
    str.append("lac"+l1.getLac()+ "\n");
    str.append("Psc"+l1.getPsc()+ "\n");
} else if(location != null && location instanceof CdmaCellLocation){
    
    CdmaCellLocation l2 = (CdmaCellLocation) location;
    str.append(l2.toString() + "\n");
}

注意:getNeighboringCellInfo ()已经被谷歌弃用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zheng_weichao/article/details/85950782

智能推荐

springboot集成thymeleaf时css js加载不出来的问题_springboot thymeleaf 不显示css js-程序员宅基地

文章浏览阅读2.1k次。springboot项目的css 和js默认位置是在static中,所以如果没有另外的修改的话,直接创建一个static文件夹,把css和js放入即可。这里放一个实例<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>儿童随访记录表</title> <!-- 引入 echarts.js --> <script src="ht._springboot thymeleaf 不显示css js

用ChatGPT三分钟免费做出数字人视频- 提升自媒体魅力_chatgpt + ai 数字人 csdn-程序员宅基地

文章浏览阅读2.1k次。这里还可以选择背景编辑以更换背景,虚拟人物的位置可以调整,都设置完成后,点击播放按钮,即可播放效果。(ps:未导出视频之前,数字人只是静态。)最后点击’合成’按钮,导出视频。_chatgpt + ai 数字人 csdn

C++编程法则365天一天一条(214)C++函数的默认参数详解_c++函数默认值在参数列表中在后面还是在前面-程序员宅基地

文章浏览阅读1.6w次。默认参数并非编程方面的重大突破,而只是提供了一种便捷的方式。在以后设计类时你将发现,通过使用默认参数,可以减少要定义的析构函数、方法以及方法重载的数量。_c++函数默认值在参数列表中在后面还是在前面

Android 自定义软键盘实现 数字九宫格_android studio九宫格软键盘设置-程序员宅基地

文章浏览阅读744次。前言最近项目在对接美团外卖功能 实现外面小哥凭取货码取货对接完功能后 用户反馈 弹出的软键盘 很难输入 数字太小了大概是下面这种显示方式需求组长说 要不搞一个自定义软键盘吧 数字搞大点 方便外卖员输入数字我设置了输入EditText的输入格式为Number 还是不行那就开搞吧先来看下实现的效果图吧实现效果GIF实现代码自定义View 一个NineNumericKeyboardView/** * Author by Lyu * Date on 2021/5/26-19:55 _android studio九宫格软键盘设置

从0开始用python实现神经网络 IMPLEMENTING A NEURAL NETWORK FROM SCRATCH IN PYTHON – AN INTRODUCTION...-程序员宅基地

文章浏览阅读150次。code地址:https://github.com/dennybritz/nn-from-scratch文章地址:http://www.wildml.com/2015/09/implementing-a-neural-network-from-scratch/ Get the code: To follow along, all the code is also available as a..._nerual networks from stratch in python

【element-ui】el-form-item 内的 el-select如何自适应宽度_el-form-item 宽度-程序员宅基地

文章浏览阅读1.6w次,点赞8次,收藏10次。问题:想让el-select自适应宽度,即 label宽度 + el-select宽度可以填满一行,想要实现这样的效果详细描述:项目中的代码如下,给 el-select 设置了 style=“width:100%” 没有作用,不论布局是变大变小,el-select 的宽度都不会有变化,就像下图所示我只有在el-select中设置固定的值如 style="width:100px"才有作用。下面是我的代码,不知道是不是我对width的设置方法有错<el-form :inline=“true” _el-form-item 宽度

随便推点

C++ 每日一练---统计每个月兔子的总数(迭代法)_1238: 【入门】统计每个月兔子的总数-程序员宅基地

这篇文章介绍了使用C++迭代法统计每个月兔子的总数,通过给出兔子生长规律的例子,并使用代码实现了统计月兔子总数的方法。

<HeadFirst_HTML与CSS> O'REILLY_Chap.13_表格与更多列表-程序员宅基地

文章浏览阅读422次。 O’REILLY_Chap.13_表格与更多列表 本博客的FollowMeReading系列初衷是在线的读书笔记. 为方便后期查阅, 故写成博客形式, 使用关键字查询便可以快读的找到相关的内容. FollowMeReading系列所选的书籍一般选自O’REILLY或Apress出版社, 尽量保证笔记内容的权威性. FollowMeRe

Android studio的gradle版本下载太慢或者content time out超时的完美解决方法_androidstudio下载gradle超时-程序员宅基地

文章浏览阅读666次,点赞11次,收藏8次。Android studio的gradle版本下载太慢或者content time out超时的完美解决方法_androidstudio下载gradle超时

dom-to-image-程序员宅基地

文章浏览阅读1.5w次,点赞14次,收藏64次。dom-to-image_dom-to-image

什么是知识库?企业知识库都写什么?-程序员宅基地

文章浏览阅读6.8k次,点赞2次,收藏19次。什么是知识库知识库(Knowledge base)是用于知识管理的一种特殊的数据库,以便于有关领域知识的采集、整理以及提取。 知识库中的知识源于领域专家或者从业者的经验教训,它是求解问题所需领域知识的集合,包括基本事实、规则和其它有关信息。构建企业知识库系统能将知识进行有效管理及合理利用,也能积累和保存信息及知识资产,加速内部信息及知识的流通,实现组织内部知识的共享。企业知识库系统的作用具体表现在:知识库系统为企业资料提供有效安全的管理,防止人员流动等原因造成的企业知识财产受损。 知识库系统使_什么是知识库

Java——List.forEach()实现continue与break功能_java foreach continue-程序员宅基地

文章浏览阅读1.2w次,点赞5次,收藏3次。问题:java中List.forEach()无法实现continue和break功能。代码:package com.ziling.mianshi;import java.util.ArrayList;import java.util.List;/** * @Author: yipeng * @Date: 2021/7/21 11:34 */public class ForEachTest { public static void main(String[] args_java foreach continue