java 基站定位_android基站定位 | 学步园

该博客介绍了如何在Java中利用Android的TelephonyManager获取手机的基站信号信息,并结合Google的接口进行基站定位。首先,从TelephonyManager获取GSM或CDMA的信号信息,然后将这些信息发送到Google的定位API,解析返回的JSON数据以获取经纬度坐标。
摘要由CSDN通过智能技术生成

基站定位首先要通过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 getCellInfo() {

List listInfo = new ArrayList();

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 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 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;

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值