Android基站定位源代码

news2024/12/25 9:36:09

经过几天的调研以及测试,终于解决了联通2G、移动2G、电信3G的基站定位代码。团队里面只有这些机器的制式了。下面就由我来做一个详细的讲解吧。
1 相关技术内容
Google Android Api里面的TelephonyManager的管理。
联通、移动、电信不同制式在获取基站位置的代码区别。
通过基站的基本信息,通过Google Gears获取对应的GPS经纬度。
通过Google Map API根据GPS经纬度获取当前位置。

2 目前存在的几个问题
由于得到的GPS经纬度在Google Map上面显示需要偏移,这块暂时没有进行处理。
没有使用PhoneStateListener来对状态实时进行更新。
没有使用线程异步获取数据
没有使用服务的方式来实时获取数据
所以如果是商业使用的话,还需进一步修改。

3 当然本部分代码已经移植到我们的家庭卫士的项目中了,2提到的问题全部解决了。

下面我针对第一部分的四大内容进行代码注解。

1 Google Android Api里面的TelephonyManager的管理。

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

通过这个方式就可以得到TelephonyManager接口。
这个接口的源代码可以通过设置在项目里面查看,这里不具体附上了。
得到TelephonyManager后,由于针对不同的运营商,代码有所不同,所以需要判断getNetworkType()
在源代码里面有如下的类型定义

    /** Network type is unknown */
    public static final int NETWORK_TYPE_UNKNOWN = 0;
    /** Current network is GPRS */
    public static final int NETWORK_TYPE_GPRS = 1;
    /** Current network is EDGE */
    public static final int NETWORK_TYPE_EDGE = 2;
    /** Current network is UMTS */
    public static final int NETWORK_TYPE_UMTS = 3;
    /** Current network is CDMA: Either IS95A or IS95B*/
    public static final int NETWORK_TYPE_CDMA = 4;
    /** Current network is EVDO revision 0*/
    public static final int NETWORK_TYPE_EVDO_0 = 5;
    /** Current network is EVDO revision A*/
    public static final int NETWORK_TYPE_EVDO_A = 6;
    /** Current network is 1xRTT*/
    public static final int NETWORK_TYPE_1xRTT = 7;
    /** Current network is HSDPA */
    public static final int NETWORK_TYPE_HSDPA = 8;
    /** Current network is HSUPA */
    public static final int NETWORK_TYPE_HSUPA = 9;
    /** Current network is HSPA */
    public static final int NETWORK_TYPE_HSPA = 10;

2 联通、移动、电信不同制式在获取基站位置的代码区别。

这部分是我实际测试出来的,经过无数次的拆机,放卡,才实现了不同制式的完美实现。
代码如下:

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
int type = tm.getNetworkType();
//中国电信为CTC
//NETWORK_TYPE_EVDO_A是中国电信3G的getNetworkType
//NETWORK_TYPE_CDMA电信2G是CDMA
if (type == TelephonyManager.NETWORK_TYPE_EVDO_A || type == TelephonyManager.NETWORK_TYPE_CDMA || type ==TelephonyManager.NETWORK_TYPE_1xRTT)
{
}
//移动2G卡 + CMCC + 2
//type = NETWORK_TYPE_EDGE
else if(type == TelephonyManager.NETWORK_TYPE_EDGE)
{
}
//联通的2G经过测试 China Unicom   1 NETWORK_TYPE_GPRS
else if(type == TelephonyManager.NETWORK_TYPE_GPRS)
{
 
}
else
{
tv.setText("Current Not Support This Type.");
}

3 通过基站的基本信息,通过Google Gears获取对应的GPS经纬度。
这部分前面的两篇文章都有提到,代码参考了网友们的代码,感谢感谢。

private Location callGear(ArrayList cellID) {
        if (cellID == null) return null;
        DefaultHttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(
                "http://www.google.com/loc/json");
        JSONObject holder = new JSONObject();
        try {
            holder.put("version", "1.1.0");
            holder.put("host", "maps.google.com");
            holder.put("home_mobile_country_code", cellID.get(0).mobileCountryCode);
            holder.put("home_mobile_network_code", cellID.get(0).mobileNetworkCode);
            holder.put("radio_type", cellID.get(0).radioType);
            holder.put("request_address", true);
            if ("460".equals(cellID.get(0).mobileCountryCode))
                holder.put("address_language", "zh_CN");
            else
                holder.put("address_language", "en_US");
            JSONObject data,current_data;
            JSONArray array = new JSONArray();
            current_data = new JSONObject();
            current_data.put("cell_id", cellID.get(0).cellId);
            current_data.put("location_area_code", cellID.get(0).locationAreaCode);
            current_data.put("mobile_country_code", cellID.get(0).mobileCountryCode);
            current_data.put("mobile_network_code", cellID.get(0).mobileNetworkCode);
            current_data.put("age", 0);
            array.put(current_data);
            if (cellID.size() > 2) {
                for (int i = 1; i < cellID.size(); i++) {
                    data = new JSONObject();
                    data.put("cell_id", cellID.get(i).cellId);
                    data.put("location_area_code", cellID.get(i).locationAreaCode);
                    data.put("mobile_country_code", cellID.get(i).mobileCountryCode);
                    data.put("mobile_network_code", cellID.get(i).mobileNetworkCode);
                    data.put("age", 0);
                    array.put(data);
                }
            }
            holder.put("cell_towers", array);
            StringEntity se = new StringEntity(holder.toString());
            Log.e("Location send", holder.toString());
            post.setEntity(se);
            HttpResponse resp = client.execute(post);
            HttpEntity entity = resp.getEntity();
 
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(entity.getContent()));
            StringBuffer sb = new StringBuffer();
            String result = br.readLine();
            while (result != null) {
                Log.e("Locaiton receive", result);
                sb.append(result);
                result = br.readLine();
            }
            if(sb.length()              return null;
            data = new JSONObject(sb.toString());
            data = (JSONObject) data.get("location");
 
            Location loc = new Location(LocationManager.NETWORK_PROVIDER);
            loc.setLatitude((Double) data.get("latitude"));
            loc.setLongitude((Double) data.get("longitude"));
            loc.setAccuracy(Float.parseFloat(data.get("accuracy").toString()));
            loc.setTime(GetUTCTime());
            return loc;
        } catch (JSONException e) {
            return null;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

4 通过Google Map API根据GPS经纬度获取当前位置。
本部分代码参考了 简单基站定位程序 ,感谢雷一兄这么好的文章。同时雷一兄的排版真的非常好看,清晰明了。

private String getLocation(Location itude) throws Exception {
        String resultString = "";
 
        /** 这里采用get方法,直接将参数加到URL上 */
        String urlString = String.format("http://maps.google.cn/maps/geo?key=abcdefg&q=%s,%s", itude.getLatitude(), itude.getLongitude());
        Log.i("URL", urlString);
 
        /** 新建HttpClient */
        HttpClient client = new DefaultHttpClient();
        /** 采用GET方法 */
        HttpGet get = new HttpGet(urlString);
        try {
            /** 发起GET请求并获得返回数据 */
            HttpResponse response = client.execute(get);
            HttpEntity entity = response.getEntity();
            BufferedReader buffReader = new BufferedReader(new InputStreamReader(entity.getContent()));
            StringBuffer strBuff = new StringBuffer();
            String result = null;
            while ((result = buffReader.readLine()) != null) {
                strBuff.append(result);
            }
            resultString = strBuff.toString();
 
            /** 解析JSON数据,获得物理地址 */
            if (resultString != null && resultString.length() > 0) {
                JSONObject jsonobject = new JSONObject(resultString);
                JSONArray jsonArray = new JSONArray(jsonobject.get("Placemark").toString());
                resultString = "";
                for (int i = 0; i < jsonArray.length(); i++) {
                    resultString = jsonArray.getJSONObject(i).getString("address");
                }
            }
        } catch (Exception e) {
            throw new Exception("获取物理位置出现错误:" + e.getMessage());
        } finally {
            get.abort();
            client = null;
        }
 
        return resultString;
    }


补充一下:
在AndroidMenifest.xml里面需要加上
android.permission.INTERNET、android.permission.ACCESS_COARSE_LOCATION、android.permission.READ_PHONE_STATE权限,否则会出错。
放在Application包前面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/596947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源赋能 普惠未来|TKEStack 诚邀您参与 2023 开放原子全球开源峰会

TKEStack 是腾讯开源的一款集强壮性和易用性于一身的企业级容器编排引擎&#xff0c;以极简的向导式界面为用户提供了容器应用全生命周期管理能力&#xff0c;帮助用户在私有云环境中快速构建 PAAS 容器云平台&#xff0c;并敏捷、高效地管理和发布应用程序。作为完全开放的项目…

华秋硬创 | 全国科技工作者日,致敬每一位科技创新者!

2023年5月30日是第七个“全国科技工作者日”&#xff0c;“全国科技工作者日”的设立旨在弘扬科学家精神&#xff0c;团结引导广大科技工作者厚植家国情怀、勇于创新争先。 今年&#xff0c;全国科技工作者日主题是“点亮精神火炬”。每一次科学探索&#xff0c;都始于一束心中…

ipad手写笔哪个牌子好用?便宜的ipad触控笔

在这无纸化的时代&#xff0c;越来越多人向往简便、快速&#xff0c;人们会更想有自己的能够快速完成&#xff0c;电容笔是出现&#xff0c;深受大众喜欢&#xff0c;随着电容笔技术的不断进步&#xff0c;电容笔越来越普遍&#xff0c;价格也越来越低&#xff0c;使用效果也越…

建造者模式的学习与使用以及和抽象工厂模式的区别

1、建造者模式的学习 当创建一个复杂对象时&#xff0c;使用建造者模式可以将对象的构建过程和表示分离开来。它允许使用相同的构建过程来创建不同的表示形式。   建造者模式的主要思想是将一个复杂对象的构建过程分解为一系列简单的步骤&#xff0c;并且使用一个指导者&…

14届蓝桥杯青少组省赛(中级组)C++_2023.5.14

选择题: 1、设只含根结点的二叉树高度为1,共有62个结点的完全二叉树的高度为?(C) A.4 B.5 C.6 D.7 2、C++中,bool类型的变量占用字节字数为?(A) A.1 B.2 C.3 D.4 3、该程序的输出为?(A) A.127 B.97 C.63 D.126 4、以下关于数组的说法中…

力扣-根据前序和后序遍历构造二叉树(java)

根据前序和后序遍历构造二叉树 leetcode 889 题&#xff08;中等&#xff09;解题思路代码演示二叉树专题 leetcode 889 题&#xff08;中等&#xff09; 原题链接&#xff1a; https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-postorder-traversal/ 题…

echart实现地图展示

最近做的页面中需要展示省级地图精确到市级且悬浮到地区上时会显示一些信息 然后参考了网址&#xff1a; “绿色金融” - 江西省 - category-work,geo地理坐标,legend,series-map地图,series-scatter散点图,title标题,tooltip提示框,visualMap视觉映射 - makeapie echarts社区…

同心旋转圆弧

效果如图: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

Unity新动画系统之动画状态机Animator Controller

1、创建动画状态机文件 &#xff08;1&#xff09;会在创建动画时自动创建 &#xff08;2&#xff09;Create----Animator Controller 2、动画状态机窗口相关 层级&#xff1a;可以在右侧齿轮设置参数大小 3、添加动画 为对象添加动画后会自动添加到状态机中 4、状态切换 …

halcon安装多个版本时,环境变量设置

记录halcon安装多个版本时&#xff0c;环境变量设置的步骤&#xff0c;方便以后查阅。 1.设置4个环境变量 找到电脑系统中的系统变量&#xff08;不同系统位置不一样&#xff09;&#xff0c;如下图&#xff1a; &#xff08;1&#xff09;变量名&#xff1a;HALCONARCH 变量…

49天精通Java,第36天,Java数组、java数组初始化、java数组赋值

目录 一、声明数组二、初始化数组三、访问数组元素四、遍历数组五、数组复制1、基本类型数组复制2、Object数组复制3、多维数组复制4、对象数组复制 大家好&#xff0c;我是哪吒。 &#x1f3c6;本文收录于&#xff0c;49天精通Java从入门到就业。 全网最细Java零基础手把手入…

企业开发前端框架2023最新前沿技术vue3+vite+vuetify+js+Tailwind Css

文章目录 前言创建项目1、打开vuetify的官网下载项目2、下载依赖3、添加tailwindcss依赖 结束 前言 最近需要开发新的项目&#xff0c;正好学习了Tailwindcss&#xff0c;所以就想着集成到新项目里来&#xff0c;一来可以精进项目经验&#xff0c;也可以感受一下tailwindcss的…

6.1黄金探底回升是否到顶,今日多空如何布局

近期有哪些消息面影响黄金走势&#xff1f;今日黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周三(5月31日)黄金期货价格攀升&#xff0c;美国国债收益率下降推动金价升至一周最高收盘位。美市尾盘&#xff0c;现货黄金收报1962.42美元/盎司&#xff0c;上升3…

实验篇(7.2) 05. SSL - 通过浏览器访问远端内网服务器 ❀ 远程访问

【简介】直接将内网服务器映射成公网IP&#xff0c;可以方便的从任何地方访问服务器的指定端口&#xff0c;但是这种方式下&#xff0c;服务器是公开且暴露的。那有没有即方便、又比较安全的远程访问服务器的方法呢&#xff1f;我们来看看SSL VPN的Web模式。 SSL VPN介绍 从概念…

小心618的iPhone优惠套路 实测对比京东更靠谱

今年的618&#xff0c;各大电商平台都纷纷摩拳擦掌&#xff0c;宣称要拿出史上最大力度来承办这次大促活动&#xff0c;希望以最大的诚意来挖掘消费者的需求潜力&#xff0c;作为资深果粉的我&#xff0c;必然也是希望能在此次618大促中买到心仪已久的Apple产品。 对比之后才发…

opencv的Mat相关操作

cv Mat类型的使用 下载安装好opencv&#xff0c;使用时只需添加如下头文件&#xff1a; #include<opencv2/opencv.hpp>另外在工程的属性页中要添加opencv的包含目录与库目录&#xff1a; 在写稍大一些工程的时候&#xff0c;尽量不要直接用using namespace cv; 因为在…

运营策略:影响内容病毒式传播的 8 个维度

目录 01 第一个影响要素就是内容的类型 02 第二个要素时内容的长度 03 第三个要素是要唤起正确的情感 04 第四个是利用趋势&#xff0c;也就是热点问题或事件 05 第五个是视觉效果 06 第六个是增加作者署 07 第七个是在正确的时间发布内容 08 第八个是影响者的力量 病毒…

“实时数据同步:构建高效的 MySQL 数据同步方案“

方案一 基于LVM快照进行备份切换 介绍: MySQL数据库本身并不支持快照功能(sqlServer支持) 因此快照备份是指通过文件系统支持的快照功能对数据库进行备份 备份的前提是将所有数据库文件放在同一文件分区中&#xff0c;然后对该分区进行快照操作 LVM是LINUX系统下对磁盘分区进…

Linux:磁盘资源耗尽故障

有两种经典原因 磁盘空间已被大量的数据占满&#xff0c;空间耗尽。 解决办法&#xff1a;将没有用的大型文件转移或删除 文件i节点耗尽故障 &#xff08;文件过多&#xff09; 解决办法&#xff1a;删除 磁盘被大型文件占满 模拟 准备了一个2G大小的分区 然后进行挂载 我…

电子企业如何高效地使用MES生产管理系统

引言&#xff1a; 在当今数字化、智能化的时代&#xff0c;电子企业的发展已经达到了一个新的高度。与此同时&#xff0c;MES生产管理系统在电子企业中扮演着越来越重要的角色。本文将探讨电子企业如何高效地使用MES生产管理系统&#xff0c;提高企业生产效率和管理水平&#…