編輯:Android開發實例
這一篇基於:Android基站定位之實現單基站定位
闡述幾個概念:
基站:類似於WIFI熱點,官方解釋,移動通信系統中,連接固定部分與無線部分,並通過空中的無線傳輸與移動台相連的設備。基站即公用移動通信基站是無線電台站的一種形式,是指在一定的無線電覆蓋區中,通過移動通信交換中心,與移動電話終端之間進行信息傳遞的無線電收發信電台。
單基站定位是指:通過手機獲取當前連接到的基站信息,來確定用戶的大概位置(用戶可能在某個基站(手機當前連接的基站)發出的無線電覆蓋區域中)。
三基站或多基站:通過手機獲取附近區域的基站信息(不是用戶當前連接的基站,得到的是一組基站信息),來確定用戶的大概位置。
獲取鄰區基站信息:
- // 獲取鄰區基站信息
- List<NeighboringCellInfo> infos = mTelephonyManager.getNeighboringCellInfo();
- StringBuffer sb = new StringBuffer("總數 : " + infos.size() + "\n");
- for (NeighboringCellInfo info1 : infos) { // 根據鄰區總數進行循環
- sb.append(" LAC : " + info1.getLac()); // 取出當前鄰區的LAC
- sb.append(" CID : " + info1.getCid()); // 取出當前鄰區的CID
- sb.append(" BSSS : " + (-113 + 2 * info1.getRssi()) + "\n"); // 獲取鄰區基站信號強度
- }
注:中國聯通的基本上獲取不到附近的基站,我測的時候使用的是中國移動。
一、探索:
1、我猜想請求參數的Json是這樣組裝的:
- JSONObject json = new JSONObject();
- json.put("version", "1.1.0");
- json.put("host", "maps.google.com");
- json.put("location_area_code", "6338");
- json.put("mobile_country_code", "460");
- json.put("mobile_network_code", "0");
- json.put("age", 0);
- JSONArray array = new JSONArray();
- JSONObject json1 = new JSONObject();
- json1.put("cell_id", "62291");
- json1.put("signal_strength", -95);
- array.put(json1);
- JSONObject json2 = new JSONObject();
- json2.put("cell_id", "62290");
- json2.put("signal_strength", -101);
- array.put(json2);
- json.put("cell_towers", array);
2、組拼好的JSON字符串:
- {
- "mobile_network_code":"0",
- "location_area_code":"6338",
- "host":"maps.google.com",
- "cell_towers":
- [
- {
- "signal_strength":-95,
- "cell_id":"62291"
- },
- {
- "signal_strength":-101,
- "cell_id":"62290"
- }
- ],
- "age":0,
- "mobile_country_code":"460",
- "version":"1.1.0"
- }
3、通過HTTP請求返回的JSON形式結果:
- {
- "location":
- {
- "latitude":"0.0",
- "longitude":"0.0",
- "address":
- {
- "city":"基站信息不存在,請從手機上讀取正確的基站信息。",
- "country":"",
- "country_code":""
- ,"county":"",
- "postal_code":"",
- "region":"",
- "street":"",
- "street_number":""
- }
- },
- "access_token":"dummytoken"
- }
二、可行的方式:
1、通過單個附近的基站信息定位:
組裝參數:
- /**
- * 獲取JSON形式的基站信息
- * @param mcc 移動國家代碼(中國的為460)
- * @param mnc 移動網絡號碼(中國移動為0,中國聯通為1,中國電信為2);
- * @param lac 位置區域碼
- * @param cid 基站編號
- * @param bsss 基站信號強度
- * @return json
- * @throws JSONException
- */
- private String getJsonCellPos(int mcc, int mnc, int lac, int cid, int bsss) 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 + "");
- json1.put("signal_strength", bsss);
- array.put(json1);
- jsonCellPos.put("cell_towers", array);
- return jsonCellPos.toString();
- }
請求的JSON字符串:
- {
- "cell_towers":
- [
- {
- "mobile_network_code":"0",
- "location_area_code":"6338",
- "cell_id":"62291",
- "signal_strength":-95,
- "age":0,
- "mobile_country_code":"460"
- }
- ],
- "host":"maps.google.com",
- "version":"1.1.0"
- }
返回JSON形式結果:
- {
- "location":
- {
- "latitude":"31.214667405",
- "longitude":"121.59903152499999",
- "address":
- {
- "city":"上海市浦東新區郭守敬路;上海奧威科技開發公司、科威國際技術轉移中心公司、張江高科技園區熱力中心[附近]",
- "country":"",
- "country_code":"",
- "county":"",
- "postal_code":"",
- "region":"",
- "street":"",
- "street_number":""
- }
- },
- "access_token":"dummytoken"
- }
2、通過多個附近的基站信息定位:
又一次猜想:
請求JSON:
- {
- "cell_towers":
- [
- {
- "mobile_network_code":"0",
- "location_area_code":"6338",
- "cell_id":"62291",
- "signal_strength":-95,
- "age":0,
- "mobile_country_code":"460"
- },
- {
- "mobile_network_code":"0",
- "location_area_code":"6338",
- "cell_id":"62290",
- "signal_strength":-101,
- "age":1,
- "mobile_country_code":"460"
- }
- ],
- "host":"maps.google.com",
- "version":"1.1.0"
- }
返回JSON:
- {
- "location":
- {
- "latitude":"31.21485922285714",
- "longitude":"121.59990774285711",
- "address":
- {
- "city":"上海市浦東新區郭守敬路276號;上海奧威科技開發公司、科威國際技術轉移中心公司、張江高科技園區熱力中心[附近]",
- "country":"",
- "country_code":"",
- "county":"",
- "postal_code":"",
- "region":"",
- "street":"",
- "street_number":""
- }
- },
- "access_token":"dummytoken"
- }
結論:第三方服務器端可能有限制,每次只接受JSONArray中的第一個元素。如果要想一次性查找附近多個基站的經緯度及所在的地址,就只能編寫for循環,一次一次的訪問第三方的服務器。
3、個人觀點:所謂的三點定位或多點定位,只是讓想知道用戶當前位置的人多了一個選擇而已。三點定位得到的是三個點,並非是一個比較准確的點。
三、測試網址:http://www.minigps.net/map3.html
轉自:http://blog.csdn.net/android_ls/article/details/8673532
當我們第一次下載QQ並且打開的時候,會有一個新手引導,引導是幾張圖片,再加上一些文字說明,向右滑動,直到結束,今天一大早起來研究了一下關於此種效果的實現之View
觀察者模式定義: Define a one-to-many dependency between objects so that when one object
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放