• Android基站定位——单基站定位 (二)


    基站定位原理:通过手机信号获取基站信息,然后调用第三方公开的根据基站信息查找基站的经纬度值及地址信息(大概位置)。

    一、通过手机信号获取基站信息
    [java] www.2cto.com
    TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
     
                   // 返回值MCC + MNC 
                   String operator = mTelephonyManager.getNetworkOperator();
                   mcc = Integer.parseInt(operator.substring(0, 3)); 
                   mnc = Integer.parseInt(operator.substring(3)); 
     
                   // 中国移动和中国联通获取LAC、CID的方式 
                   GsmCellLocation location = (GsmCellLocation) mTelephonyManager.getCellLocation(); 
                   lac = location.getLac(); 
                   cid = location.getCid(); 
     
                   Log.i(TAG, "MCC = " + mcc + " MNC = " + mnc + " LAC = " + lac + " CID = " + cid); 
    二、调用第三方公开的API(根据基站信息查找基站的经纬度值及地址信息)
          1、组拼JSON形式的请求参数
    [java] 
    /**
        * 获取JSON形式的基站信息
        * @param mcc 移动国家代码(中国的为460)
        * @param mnc 移动网络号码(中国移动为0,中国联通为1,中国电信为2); 
        * @param lac 位置区域码
        * @param cid 基站编号
        * @return json
        * @throws JSONException
        */ 
       private String getJsonCellPos(int mcc, int mnc, int lac, int cid) throws JSONException { 
           JSONObject jsonCellPos = new JSONObject(); 
           jsonCellPos.put("version", "1.1.0"); 
           jsonCellPos.put("host", "maps.google.com"); 
     
           JSONArray array = new JSONArray(); 
           JSONObject json1 = new JSONObject(); 
           json1.put("location_area_code", "" + lac + ""); 
           json1.put("mobile_country_code", "" + mcc + ""); 
           json1.put("mobile_network_code", "" + mnc + ""); 
           json1.put("age", 0); 
           json1.put("cell_id", "" + cid + ""); 
           array.put(json1); 
     
           jsonCellPos.put("cell_towers", array); 
           return jsonCellPos.toString(); 
       } 
          2、通过HTTP协议网络请求源码
    [plain] 
    request URL:http://www.minigps.net/minigps/map/google/location 
    Request Method:POST 
    Status Code:200 OK 
    Request Headersview source 
    Accept:application/json, text/javascript, */*; q=0.01 
    Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3 
    Accept-Encoding:gzip,deflate,sdch 
    Accept-Language:zh-CN,zh;q=0.8 
    Connection:keep-alive 
    Content-Length:191 
    Content-Type:application/json; charset=UTF-8 
    Cookie:bdshare_firstime=1356366713546; JSESSIONID=68243935CD3355089CF07A3A22AAB372 
    Host:www.minigps.net 
    Origin:http://www.minigps.net 
    Referer:http://www.minigps.net/map.html 
    User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 
    X-Requested-With:XMLHttpRequest 
    Request Payload 
    {"cell_towers":[{"mobile_network_code":"1","location_area_code":"43018","cell_id":"11152773","age":0,"mobile_country_code":"460"}],"host":"maps.google.com","version":"1.1.0"}
     
    Response Headersview source 
    Content-Type:application/json 
    Date:Sat, 03 Jan 2013 14:03:15 GMT 
    Server:Apache-Coyote/1.1 
    Transfer-Encoding:chunked 
         
            3、用JAVA代码具体实现:
    [java] 
    /**
        * 调用第三方公开的API根据基站信息查找基站的经纬度值及地址信息
        */ 
       public String httpPost(String url, String jsonCellPos) throws IOException{ 
           byte[] data = jsonCellPos.toString().getBytes(); 
           URL realUrl = new URL(url); 
           HttpURLConnection httpURLConnection = (HttpURLConnection) realUrl.openConnection(); 
           httpURLConnection.setConnectTimeout(6 * 1000); 
           httpURLConnection.setDoOutput(true); 
           httpURLConnection.setDoInput(true); 
           httpURLConnection.setUseCaches(false); 
           httpURLConnection.setRequestMethod("POST"); 
           httpURLConnection.setRequestProperty("Accept", "application/json, text/javascript, */*; q=0.01"); 
           httpURLConnection.setRequestProperty("Accept-Charset", "GBK,utf-8;q=0.7,*;q=0.3"); 
           httpURLConnection.setRequestProperty("Accept-Encoding", "gzip,deflate,sdch"); 
           httpURLConnection.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.8"); 
           httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
           httpURLConnection.setRequestProperty("Content-Length", String.valueOf(data.length)); 
           httpURLConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
     
           httpURLConnection.setRequestProperty("Host", "www.minigps.net");
           httpURLConnection.setRequestProperty("Referer", "http://www.minigps.net/map.html"); 
           httpURLConnection.setRequestProperty("User-Agent", 
                   "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4X-Requested-With:XMLHttpRequest");
     
           httpURLConnection.setRequestProperty("X-Requested-With", "XMLHttpRequest"); 
           httpURLConnection.setRequestProperty("Host", "www.minigps.net");
     
           DataOutputStream outStream = new DataOutputStream(httpURLConnection.getOutputStream()); 
           outStream.write(data); 
           outStream.flush(); 
           outStream.close(); 
     
           if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { 
               InputStream inputStream = httpURLConnection.getInputStream();
               return new String(read(inputStream)); 
           } 
           return null; 
       } 
          4、读取返回的JSON数据流代码:
    [java] 
        * 读取IO流并以byte[]形式存储
        * @param inputSream InputStream
        * @return byte[]
        * @throws IOException
        */ 
       public byte[] read(InputStream inputSream) throws IOException { 
           ByteArrayOutputStream outStream = new ByteArrayOutputStream();
           int len = -1; 
           byte[] buffer = new byte[1024]; 
           while ((len = inputSream.read(buffer)) != -1) { 
               outStream.write(buffer, 0, len); 
           } 
           outStream.close(); 
           inputSream.close(); 
     
           return outStream.toByteArray(); 
       } 
     
    三、请求参数及返回结果的JSON形式:
          1、请求的JSON参数值:
    [plain] 
            "cell_towers": 
                [ 
                 { 
                     "mobile_network_code":"1", 
                     "location_area_code":"43018", 
                     "cell_id":"11152773", 
                     "age":0, 
                     "mobile_country_code":"460" 
                 } 
                ], 
                "host":"maps.google.com", 
                "version":"1.1.0" 
            } 
           2、返回的JSON结果值:
    [plain] view plaincopy
         "location": 
             { 
                 "latitude":"31.211389541625977", 
                 "longitude":"121.60332489013672", 
                 "address": 
                     {"city": 
                         "上海市浦东新区居里路432号;浦东新区光启安老院、第一三共制药上海公司、SUNPLUS[附近]",
                         "country":"", 
                         "country_code":"", 
                         "county":"", 
                         "postal_code":"", 
                         "region":"", 
                         "street":"", 
                         "street_number":"" 
                     } 
             }, 
             "access_token":"dummytoken" 
        } 
    四、完整代码及所需权限:
    Java代码:
    [java]
    package com.easipass.test; 
     
    import java.io.ByteArrayOutputStream; 
    import java.io.DataOutputStream; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.net.HttpURLConnection; 
    import java.net.URL; 
     
    import org.json.JSONArray; 
    import org.json.JSONException; 
    import org.json.JSONObject; 
     
    import android.app.Activity; 
    import android.content.Context; 
    import android.os.Bundle; 
    import android.telephony.TelephonyManager; 
    import android.telephony.gsm.GsmCellLocation; 
    import android.util.Log; 
    import android.view.View; 
     
    /**
    * 功能描述:单基站定位
    * @author android_ls
    */ 
    public class GSMCellLocationActivity extends Activity { 
     
        private static final String TAG = "GSMCellLocationActivity"; 
     
        private int mcc; 
     
        private int mnc; 
     
        private int lac; 
     
        private int cid; 
     
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main); 
     
            // 获取基站信息 
            findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { 
     
                @Override 
                public void onClick(View v) { 
     
                    TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
     
                    // 返回值MCC + MNC 
                    String operator = mTelephonyManager.getNetworkOperator();
                    mcc = Integer.parseInt(operator.substring(0, 3)); 
                    mnc = Integer.parseInt(operator.substring(3)); 
     
                    // 中国移动和中国联通获取LAC、CID的方式 
                    GsmCellLocation location = (GsmCellLocation) mTelephonyManager.getCellLocation(); 
                    lac = location.getLac(); 
                    cid = location.getCid(); 
     
                    Log.i(TAG, "MCC = " + mcc + " MNC = " + mnc + " LAC = " + lac + " CID = " + cid); 
     
                    new Thread() { 
                        @Override 
                        public void run() { 
                            try { 
                                String json = getJsonCellPos(mcc, mnc, lac, cid); 
                                Log.i(TAG, "request = " + json); 
     
                                String url = "http://www.minigps.net/minigps/map/google/location"; 
                                String result = httpPost(url, json); 
                                Log.i(TAG, "result = " + result); 
                            } catch (Exception e) { 
                                // TODO Auto-generated catch block 
                                e.printStackTrace(); 
                            } 
                        } 
                    }.start(); 
     
                } 
            }); 
        } 
     
        /**
         * 调用第三方公开的API根据基站信息查找基站的经纬度值及地址信息
         */ 
        public String httpPost(String url, String jsonCellPos) throws IOException{ 
            byte[] data = jsonCellPos.toString().getBytes(); 
            URL realUrl = new URL(url); 
            HttpURLConnection httpURLConnection = (HttpURLConnection) realUrl.openConnection(); 
            httpURLConnection.setConnectTimeout(6 * 1000); 
            httpURLConnection.setDoOutput(true); 
            httpURLConnection.setDoInput(true); 
            httpURLConnection.setUseCaches(false); 
            httpURLConnection.setRequestMethod("POST"); 
            httpURLConnection.setRequestProperty("Accept", "application/json, text/javascript, */*; q=0.01"); 
            httpURLConnection.setRequestProperty("Accept-Charset", "GBK,utf-8;q=0.7,*;q=0.3"); 
            httpURLConnection.setRequestProperty("Accept-Encoding", "gzip,deflate,sdch"); 
            httpURLConnection.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.8"); 
            httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
            httpURLConnection.setRequestProperty("Content-Length", String.valueOf(data.length)); 
            httpURLConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
     
            httpURLConnection.setRequestProperty("Host", "www.minigps.net");
            httpURLConnection.setRequestProperty("Referer", "http://www.minigps.net/map.html"); 
            httpURLConnection.setRequestProperty("User-Agent", 
                    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4X-Requested-With:XMLHttpRequest");
     
            httpURLConnection.setRequestProperty("X-Requested-With", "XMLHttpRequest"); 
            httpURLConnection.setRequestProperty("Host", "www.minigps.net");
     
            DataOutputStream outStream = new DataOutputStream(httpURLConnection.getOutputStream()); 
            outStream.write(data); 
            outStream.flush(); 
            outStream.close(); 
     
            if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { 
                InputStream inputStream = httpURLConnection.getInputStream();
                return new String(read(inputStream)); 
            } 
            return null; 
        } 
     
        /** 
         * 获取JSON形式的基站信息 
         * @param mcc 移动国家代码(中国的为460) 
         * @param mnc 移动网络号码(中国移动为0,中国联通为1,中国电信为2);  
         * @param lac 位置区域码 
         * @param cid 基站编号 
         * @return json 
         * @throws JSONException 
         */ 
        private String getJsonCellPos(int mcc, int mnc, int lac, int cid) throws JSONException { 
            JSONObject jsonCellPos = new JSONObject(); 
            jsonCellPos.put("version", "1.1.0"); 
            jsonCellPos.put("host", "maps.google.com"); 
     
            JSONArray array = new JSONArray(); 
            JSONObject json1 = new JSONObject(); 
            json1.put("location_area_code", "" + lac + ""); 
            json1.put("mobile_country_code", "" + mcc + ""); 
            json1.put("mobile_network_code", "" + mnc + ""); 
            json1.put("age", 0); 
            json1.put("cell_id", "" + cid + ""); 
            array.put(json1); 
     
            jsonCellPos.put("cell_towers", array); 
            return jsonCellPos.toString(); 
        } 
     
        /**
         * 读取IO流并以byte[]形式存储
         * @param inputSream InputStream
         * @return byte[]
         * @throws IOException
         */ 
        public byte[] read(InputStream inputSream) throws IOException { 
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            int len = -1; 
            byte[] buffer = new byte[1024]; 
            while ((len = inputSream.read(buffer)) != -1) { 
                outStream.write(buffer, 0, len); 
            } 
            outStream.close(); 
            inputSream.close(); 
     
            return outStream.toByteArray(); 
        } 
     
    AndroidManifest.xml添加获取位置信息的权限:
    [html]
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.INTERNET" />
  • 相关阅读:
    中介者模式
    观察者模式
    javascript深入理解js闭包
    外观模式
    模板方法模式
    浅析C#深拷贝与浅拷贝
    C#浅拷贝与深拷贝区别
    6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱
    原型模式
    设计模式总结
  • 原文地址:https://www.cnblogs.com/LiaoHao/p/3268003.html
Copyright © 2020-2023  润新知