这里给大家分享下基站定位的实现,基站定位首先要通过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; } } }