android 基站定位
2012-10-17 01:04
381 查看
这里给大家分享下基站定位的实现,基站定位首先要通过TelephonyManager得到手机的信号信息,比如基站的国家编码,小区id等......得到这些后需要向google提供的接口提交这些参数,然后就会返回基站的相关信息。
废话不多说直接上代码吧:
[java]
view plaincopyprint?
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服务器并解析结果:
[java]
view plaincopyprint?
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;
}
}
}
废话不多说直接上代码吧:
[java]
view plaincopyprint?
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();
}
}
}
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服务器并解析结果:
[java]
view plaincopyprint?
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;
}
}
}
相关文章推荐
- android平台上的json解析 && 基站定位原理及实现
- Android开发笔记之简单基站定位程序的实现
- android基站定位
- android 基站定位和gps定位个人体验
- Android基站定位源代码
- Android基站定位——三基站(多基站)定位(三)
- 在Android里完美实现基站和WIFI定位
- Android基站定位
- Android获取手机基站信息并进行基站定位(基站定位原理)
- Android GSM+CDMA基站定位
- Android 简单基站定位程序
- 在Android里完美实现基站和WIFI定位
- android开发通过基站手机网络实现定位功能(Google实现)
- android gps wifi 基站 定位集合
- Android基站定位——通过手机信号获取基站信息(一)
- android 基站定位 wifi定位
- 在Android里完美实现基站和WIFI定位
- 【Android开发笔记】4.简单基站定位程序
- Android基站定位——单基站定位(二)
- WIFI之一:WIFI常识 && ANDROID平台上调试APM6633 && 基站定位原理