Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android基站定位——單基站定位 (二)

Android基站定位——單基站定位 (二)

編輯:關於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 + "\t MNC = " + mnc + "\t LAC = " + lac + "\t 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 + "\t MNC = " + mnc + "\t LAC = " + lac + "\t 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" />  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved