张雨生Mr

目录

Android基站定位源代码

1、 关联技能内容
Google Android Api里边的TelephonyManager的 管理 。
联通、移动、电信不一样制式在获取基站方位的代码差异。
经过基站的基本信息,经过Google Gears获取对应的GPS经纬度。
经过Google Map API依据GPS经纬度获取当时方位。

2、 当时存在的几个疑问
因为得到的GPS经纬度在Google Map上面显现需求偏移,这块暂时没有进行处置。
没有运用PhoneStateListener来对状况实时进行更新。
没有运用线程异步获取数据
没有运用效劳的办法来实时获取数据
所以如果是商业运用的话,还需进一步修正。
3 、当然本有些代码现已移植到咱们的家庭卫兵的项目中了,2说到的疑问悉数处理了。
下面我对于榜首有些的四大内容进行代码注解。
1 Google Android Api里边的TelephonyManager的 管理 。

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

经过这个办法就能够得到TelephonyManager接口。
这个接口的源代码能够经过设置在项目里边检查,这里不详细附上了。
得到TelephonyManager后,因为对于不一样的运营商,代码有所不一样,所以需求判别getNetworkType()
在源代码里边有如下的类型界说
/** Network type is unknown */
public static final int NETWORK_TYPE_UNKNOWN = 0;
/** Current network is GPRS */
public static final int NETWORK_TYPE_GPRS = 1;
/** Current network is EDGE */
public static final int NETWORK_TYPE_EDGE = 2;
/** Current network is UMTS */
public static final int NETWORK_TYPE_UMTS = 3;
/** Current network is CDMA: Either IS95A or IS95B*/
public static final int NETWORK_TYPE_CDMA = 4;
/** Current network is EVDO revision 0*/
public static final int NETWORK_TYPE_EVDO_0 = 5;
/** Current network is EVDO revision A*/
public static final int NETWORK_TYPE_EVDO_A = 6;
/** Current network is 1xRTT*/
public static final int NETWORK_TYPE_1xRTT = 7;
/** Current network is HSDPA */
public static final int NETWORK_TYPE_HSDPA = 8;
/** Current network is HSUPA */
public static final int NETWORK_TYPE_HSUPA = 9;
/** Current network is HSPA */
public static final int NETWORK_TYPE_HSPA = 10;

2 联通、移动、电信不一样制式在获取基站方位的代码差异。
这有些是我实践测验出来的,经过无数次的拆机,放卡,才完成了不一样制式的完满完成。
代码如下:
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
int type = tm.getNetworkType();
//中国电信为CTC
//NETWORK_TYPE_EVDO_A是中国电信3G的getNetworkType
//NETWORK_TYPE_CDMA电信2G是CDMA
if (type == TelephonyManager.NETWORK_TYPE_EVDO_A || type == TelephonyManager.NETWORK_TYPE_CDMA || type ==TelephonyManager.NETWORK_TYPE_1xRTT)
{
}
//移动2G卡 + CMCC + 2
//type = NETWORK_TYPE_EDGE
else if(type == TelephonyManager.NETWORK_TYPE_EDGE)
{
}
//联通的2G经过测验 China Unicom  NETWORK_TYPE_GPRS
else if(type == TelephonyManager.NETWORK_TYPE_GPRS)
{

}
else
{
tv.setText(“Current Not Support This Type.”);
}

3 经过基站的基本信息,经过Google Gears获取对应的GPS经纬度。
这有些前面的两篇文章都有说到,代码参阅了网友们的代码,谢谢谢谢。
private Location callGear(ArrayList cellID) {
if (cellID == null) return null;
DefaultHttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(
“http://www.谷歌.com/loc/json”);
JSONObject holder = new JSONObject();
try {
holder.put(“version”, “1.1.0〃);
holder.put(“host”, “maps.谷歌.com”);
holder.put(“home_mobile_country_code”, cellID.get(0).mobileCountryCode);
holder.put(“home_mobile_network_code”, cellID.get(0).mobileNetworkCode);
holder.put(“radio_type”, cellID.get(0).radioType);
holder.put(“request_address”, true);
if (“460〃.equals(cellID.get(0).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”, cellID.get(0).cellId);
current_data.put(“location_area_code”, cellID.get(0).locationAreaCode);
current_data.put(“mobile_country_code”, cellID.get(0).mobileCountryCode);
current_data.put(“mobile_network_code”, cellID.get(0).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”, cellID.get(i).cellId);
data.put(“location_area_code”, cellID.get(i).locationAreaCode);
data.put(“mobile_country_code”, cellID.get(i).mobileCountryCode);
data.put(“mobile_network_code”, cellID.get(i).mobileNetworkCode);
data.put(“age”, 0);
array.put(data);
}
}
holder.put(“cell_towers”, array);
StringEntity se = new StringEntity(holder.toString());
Log.e(“Location send”, holder.toString());
post.setEntity(se);
HttpResponse resp = client.execute(post);
HttpEntity entity = resp.getEntity();

BufferedReader br = new BufferedReader(
new InputStreamReader(entity.getContent()));
StringBuffer sb = new StringBuffer();
String result = br.readLine();
while (result != null) {
Log.e(“Locaiton receive”, result);
sb.append(result);
result = br.readLine();
}
if(sb.length() return null;
data = new JSONObject(sb.toString());
data = (JSONObject) data.get(“location”);

Location loc = new 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(GetUTCTime());
return loc;
} catch (JSONException e) {
return null;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

4 经过Google Map API依据GPS经纬度获取当时方位。
本有些代码参阅了 简略基站定位程序 ,谢谢雷一兄这么好的文章。一起雷一兄的排版真的十分美观,明晰明晰。

private String getLocation(Location itude) throws Exception {
String resultString = “”;

/** 这里选用get办法,直接将参数加到URL上 */
String urlString = String.format(“http://maps.谷歌.cn/maps/geo?key=abcdefg&q=%s,%s”, itude.getLatitude(), itude.getLongitude());
Log.i(“URL”, urlString);

/** 新建HttpClient */
HttpClient client = new DefaultHttpClient();
/** 选用GET办法 */
HttpGet get = new HttpGet(urlString);
try {
/** 建议GET恳求并取得回来数据 */
HttpResponse response = client.execute(get);
HttpEntity entity = response.getEntity();
BufferedReader buffReader = new BufferedReader(new InputStreamReader(entity.getContent()));
StringBuffer strBuff = new StringBuffer();
String result = null;
while ((result = buffReader.readLine()) != null) {
strBuff.append(result);
}
resultString = strBuff.toString();

/** 解析JSON数据,取得物理地址 */
if (resultString != null && resultString.length() > 0) {
JSONObject jsonobject = new JSONObject(resultString);
JSONArray jsonArray = new JSONArray(jsonobject.get(“Placemark”).toString());
resultString = “”;
for (int i = 0; i < jsonArray.length(); i++) {
resultString = jsonArray.getJSONObject(i).getString(“address”);
}
}
} catch (Exception e) {
throw new Exception(“获取物理方位呈现过错:” + e.getMessage());
} finally {
get.abort();
client = null;
}

5 、最要害的出来了,附上代码吧。
AndroidPosition
弥补一下:
在AndroidMenifest.xml里边需求加上
android.permission.INTERNET、android.permission.ACCESS_COARSE_LOCATION、android.permission.READ_PHONE_STATE权限,不然会犯错。
放在Application包前面。

— 于 共写了5774个字
— 文内使用到的标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注