这里给大家分享下基站定位的实现,基站定位首先要通过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;
}
}
}
分享到:
相关推荐
总之,Android基站定位是移动设备定位的一种重要方式,尽管存在精度限制,但结合其他技术,如A-GPS和Wi-Fi定位,可以为用户提供较好的位置服务。在开发过程中,理解并合理运用这些技术,同时注意用户隐私保护,是...
在描述中提到,这个特定的Android基站定位程序目前只支持中国联通和中国移动的网络。这是因为这两个运营商在国内拥有广泛的基站覆盖,数据较为完善,便于进行定位计算。而中国电信由于其网络架构和频段的不同,可能...
本节将深入探讨Android基站定位的概念、实现原理以及如何在实际应用中使用。 首先,基站定位的基本原理是利用手机与多个基站之间的信号强度或时间差来确定手机的位置。每个基站都有一个独特的识别码,当手机连接到...
在Android开发中,基站定位是一种常见的获取用户地理位置的方法,它主要依赖于移动设备与周围基站之间的信号强度来确定位置。这种技术尤其适用于GPS信号不佳或者无法接收到GPS信号的环境,如室内。在这个名为...
下面将详细探讨Android基站定位的基本原理、实现方法以及可能涉及的关键技术。 **基站定位原理** 基站定位是通过测量手机与多个基站之间的信号强度和到达时间差(Time Difference of Arrival, TDOA)来计算设备位置...
以下是关于“android基站定位代码”及相关标签的详细知识点: 1. **基站定位原理**: - 移动设备会接收到周围多个基站发射的信号,每个基站都有其唯一的识别码(Cell ID)和位置区域码(LAC)。 - 设备计算与每个...
总之,这个“android基站定位源代码”是一个学习和理解Android基站定位技术的好资源,它可以帮助开发者深入理解移动定位的原理,并在此基础上进行定制和优化,以满足特定应用的需求。通过研究和实践,你可以进一步...
本压缩包"Android基站定位源码.zip"包含了实现这一功能的源代码,下面我们将深入探讨其背后的原理和技术实现。 基站定位的基本原理是利用手机接收到的多个基站的信号,通过三角测量法计算出手机的位置。每个基站...
本篇将深入探讨Android基站定位的源码实现,包括基本原理、关键步骤以及涉及到的相关API。 基站定位主要依赖于移动网络中的Cell ID(小区ID)和LAC(Location Area Code,位置区代码)。每个基站都有一个唯一的Cell...
下面将详细探讨Android基站定位的原理、实现方法以及源码解析。 一、基站定位原理 基站定位主要依赖于三角测量法。手机会接收到周围多个基站发射的无线电信号,每个基站都会有一个已知的地理位置。通过计算手机到...
下面将详细阐述Android基站定位的相关知识点。 一、基站定位原理 基站定位的基本思想是利用手机接收到来自多个基站的无线电信号,通过计算信号到达时间差(Time Difference of Arrival, TDOA)或信号强度(Received...