這裡給大家分享下基站定位的實現,基站定位首先要通過TelephonyManager得到手機的訊號資訊,比如基站的國家編碼,小區id等......得到這些後需要向google提供的介面提交這些參數,然後就會返回基站的相關資訊。
廢話不多說直接上代碼吧:
import java.io.Serializable;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.telephony.NeighboringCellInfo;import android.telephony.TelephonyManager;import android.telephony.cdma.CdmaCellLocation;import android.telephony.gsm.GsmCellLocation;import android.util.Log;/** * @author yangzhiqiang * */public class CellIdInfoManager implements Serializable {/** * */private static final long serialVersionUID = 5481154371450408380L;private Context context;public CellIdInfoManager(Context context) {super();this.context = context;}public List<CellInfo> getCellInfo() {List<CellInfo> listInfo = new ArrayList<CellInfo>();int countryCode;int networkCode;int areaCode;CellInfo info = new CellInfo();GsmCellLocation gsm = null;TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);if (manager.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) {gsm = (GsmCellLocation) manager.getCellLocation();if (gsm == null) {return null;}if (manager.getNetworkOperator() == null|| manager.getNetworkOperator().length() == 0) {return null;}countryCode = Integer.parseInt(manager.getNetworkOperator().substring(0, 3));networkCode = Integer.parseInt(manager.getNetworkOperator().substring(3, 5));areaCode = gsm.getLac();info.cellId = gsm.getCid();info.mobileCountryCode = countryCode;info.mobileNetworkCode = networkCode;info.locationAreaCode = areaCode;info.radio_type = "gsm";listInfo.add(info);List<NeighboringCellInfo> list = manager.getNeighboringCellInfo();for (NeighboringCellInfo i : list) {CellInfo ci = new CellInfo();ci.cellId = i.getCid();ci.mobileCountryCode = countryCode;ci.mobileNetworkCode = networkCode;ci.locationAreaCode = areaCode;ci.radio_type = "gsm";listInfo.add(ci);}} else if (manager.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) {CdmaCellLocation cdma = (CdmaCellLocation) manager.getCellLocation();if (cdma == null) {return null;}if (manager.getNetworkOperator() == null|| manager.getNetworkOperator().length() == 0) {return null;}Log.v("TAG", "CDMA");info.cellId = cdma.getBaseStationId();info.mobileCountryCode = Integer.parseInt(manager.getNetworkOperator());info.mobileNetworkCode = cdma.getSystemId();info.locationAreaCode = cdma.getNetworkId();info.radio_type = "cdma";listInfo.add(info);}return listInfo;}public class CellInfo {// 基站編號public int cellId;// 國家代碼public int mobileCountryCode;// 網路代碼public int mobileNetworkCode;// 地區代碼public int locationAreaCode;public String radio_type;public CellInfo() {super();}}}
上面是得到手機訊號的資訊,下面是將這些資訊發送到google伺服器並解析結果:
import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.Serializable;import java.util.List;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.DefaultHttpClient;import org.json.JSONArray;import org.json.JSONObject;import android.location.Location;import android.util.Log;import com.metarnet.gps.CellIdInfoManager.CellInfo;/** * @author Administrator * */public class NetworkLocationManager implements Serializable {/** * */private static final long serialVersionUID = 1185788569820321281L;public static Location getBaseStationLocation(List<CellInfo> cellID) {if (cellID == null) {Log.i("TAG", "cellId is null.");return null;}DefaultHttpClient client = new DefaultHttpClient();HttpPost post = new HttpPost("http://www.google.com/loc/json");JSONObject holder = new JSONObject();try {CellInfo info = cellID.get(0);holder.put("version", "1.1.0");holder.put("host", "maps.google.com");holder.put("home_mobile_country_code", info.mobileCountryCode);holder.put("home_mobile_network_code", info.mobileNetworkCode);holder.put("request_address", true);holder.put("radio_type", info.radio_type);if ("460".equals(info.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", info.cellId);current_data.put("location_area_code", info.locationAreaCode);current_data.put("mobile_country_code", info.mobileCountryCode);current_data.put("mobile_network_code", info.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", info.cellId);data.put("location_area_code", info.locationAreaCode);data.put("mobile_country_code", info.mobileCountryCode);data.put("mobile_network_code", info.mobileNetworkCode);data.put("age", 0);array.put(data);}}holder.put("cell_towers", array);StringEntity se = new StringEntity(holder.toString());post.setEntity(se);HttpResponse resp = client.execute(post);int state = resp.getStatusLine().getStatusCode();if (state == HttpStatus.SC_OK) {HttpEntity entity = resp.getEntity();if (entity != null) {BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent()));StringBuffer sb = new StringBuffer();String resute = "";while ((resute = br.readLine()) != null) {sb.append(resute);}br.close();data = new JSONObject(sb.toString());data = (JSONObject) data.get("location");Location loc = new Location(android.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(System.currentTimeMillis());return loc;} else {return null;}} else {Log.v("TAG", state + "");return null;}} catch (Exception e) {Log.e("TAG", e.getMessage());return null;}}}