`
104zz
  • 浏览: 1507743 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

android 基于基站,apn,gps,wifi,network 根据不同手机sim卡获取经纬度

阅读更多

 

一:新建MyLocation类,本类主要管理使用各种获取经纬度的方法,由于代码比较多就不一一解释直接上代码:

package com.android.location2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
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.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.telephony.TelephonyManager;
import android.telephony.cdma.CdmaCellLocation;
import android.widget.Toast;
import com.android.gps.AddressTask;
import com.android.gps.CellIDInfo;
import com.android.gps.GpsTask;
import com.android.gps.GpsTask.GpsData;
import com.android.gps.GpsTaskCallBack;
import com.android.gps.IAddressTask;
import com.android.gps.IAddressTask.MLocation;

public class MyLocation {

	private LocationCallBack callBack;
	private boolean status = false;

	public MyLocation(LocationCallBack callBack, Activity cxt) {
		this.callBack = callBack;
		if (getMobileType(cxt) == 3) {

			TelephonyManager tm = (TelephonyManager) cxt
					.getSystemService(Context.TELEPHONY_SERVICE);
			CdmaCellLocation location = (CdmaCellLocation) tm.getCellLocation();
			if (location == null)
				return;
			int sid = location.getSystemId();// 系统标识 mobileNetworkCode
			int bid = location.getBaseStationId();// 基站小区号 cellId
			int nid = location.getNetworkId();// 网络标识 locationAreaCode
			ArrayList<CellIDInfo> CellID = new ArrayList<CellIDInfo>();
			CellIDInfo info = new CellIDInfo();
			info.cellId = bid;
			info.locationAreaCode = nid;
			info.mobileNetworkCode = String.valueOf(sid);
			info.mobileCountryCode = tm.getNetworkOperator().substring(0, 3);
			info.mobileCountryCode = tm.getNetworkOperator().substring(3, 5);
			info.radioType = "cdma";
			CellID.add(info);
			Location mLocation = callGear(CellID);
			if (mLocation != null) {
				callBack.onCurrentLocation(mLocation.getLatitude(),
						mLocation.getLongitude());
			}
		} else {
			Location mLocation = getLocation(cxt);
			if (mLocation != null) {
				callBack.onCurrentLocation(mLocation.getLatitude(),
						mLocation.getLongitude());
			} else {
				getMeLocation(cxt);
			}
		}
	}

	public interface LocationCallBack {
		void onCurrentLocation(double latitude, double longitude);

	}

	// 调用google gears的方法,该方法调用gears来获取经纬度
	private Location callGear(ArrayList<CellIDInfo> cellID) {
		if (cellID == null)
			return null;

		DefaultHttpClient client = new DefaultHttpClient();
		HttpPost post = new HttpPost("http://www.google.com/loc/json");
		JSONObject holder = new JSONObject();

		try {
			holder.put("version", "1.1.0");
			holder.put("host", "maps.google.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);
			current_data.put("signal_strength", -60);
			current_data.put("timing_advance", 5555);
			array.put(current_data);

			holder.put("cell_towers", array);

			StringEntity se = new StringEntity(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) {
				sb.append(result);
				result = br.readLine();
			}

			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(System.currentTimeMillis());// AppUtil.getUTCTime());
			return loc;
		} catch (JSONException e) {
			e.printStackTrace();
			return null;
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	@SuppressWarnings("unchecked")
	public void getMeLocation(final Activity cxt) {
		do_apn(cxt);
		if (status) {
			status = false;
			do_wifi(cxt);
		} else if (status) {
			status = false;
			GpsTask gpstask = new GpsTask(cxt, new GpsTaskCallBack() {

				public void gpsConnectedTimeOut() {
					Toast.makeText(cxt, "Error", Toast.LENGTH_LONG).show();
				}

				public void gpsConnected(GpsData gpsdata) {
					do_gps(gpsdata, cxt);
				}

			}, 3000);
			gpstask.execute();
		}

	}

	private void do_apn(final Activity cxt) {

		new AsyncTask<Void, Void, MLocation>() {

			protected MLocation doInBackground(Void... params) {
				MLocation location = null;
				try {
					location = new AddressTask(cxt, IAddressTask.DO_APN)
							.doApnPost();
				} catch (Exception e) {
					e.printStackTrace();
				}
				if (location != null)
					return location;
				else
					return null;
			}

			protected void onPreExecute() {
				super.onPreExecute();
			}

			protected void onPostExecute(MLocation result) {
				if (result != null) {
					setData(result);
					status = true;
				} else {
					status = false;
				}
				super.onPostExecute(result);
			}

		}.execute();

	}

	private void do_gps(final GpsData gpsdata, final Activity cxt) {
		new AsyncTask<Void, Void, MLocation>() {

			protected MLocation doInBackground(Void... params) {
				MLocation location = null;
				try {
					location = new AddressTask(cxt, IAddressTask.DO_GPS)
							.doGpsPost(gpsdata.getLatitude(),
									gpsdata.getLongitude());
				} catch (Exception e) {
					e.printStackTrace();
				}
				return location;
			}

			protected void onPreExecute() {
				super.onPreExecute();
			}

			protected void onPostExecute(MLocation result) {
				// gps_tip.setText(result);
				if (result != null) {
					setData(result);
					status = true;
				} else {
					status = false;
				}
				super.onPostExecute(result);
			}

		}.execute();

	}

	private void do_wifi(final Activity cxt) {
		new AsyncTask<Void, Void, MLocation>() {

			protected MLocation doInBackground(Void... params) {
				MLocation location = null;
				try {
					location = new AddressTask(cxt, IAddressTask.DO_WIFI)
							.doWifiPost();
				} catch (Exception e) {
					e.printStackTrace();
				}
				if (location == null) {
					return null;
				} else
					return location;
			}

			protected void onPreExecute() {
				super.onPreExecute();
			}

			protected void onPostExecute(MLocation result) {
				if (result != null) {
					setData(result);
					status = true;
				} else {
					status = false;
				}
				super.onPostExecute(result);
			}

		}.execute();

	}

	private void setData(MLocation result) {

		callBack.onCurrentLocation(result.getLatitude(), result.getLongitude());
	}

	// Get the Location by GPS or WIFI
	public Location getLocation(Context context) {
		LocationManager locMan = (LocationManager) context
				.getSystemService(Context.LOCATION_SERVICE);
		Location location = locMan
				.getLastKnownLocation(LocationManager.GPS_PROVIDER);
		if (location == null) {
			location = locMan
					.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
		}
		return location;
	}

	private int getMobileType(Context context) {
		TelephonyManager iPhoneManager = (TelephonyManager) context
				.getSystemService(Context.TELEPHONY_SERVICE);
		String iNumeric = iPhoneManager.getSimOperator();
		if (iNumeric.length() > 0) {
			if (iNumeric.equals("46000") || iNumeric.equals("46002")) {
				return 1;
			} else if (iNumeric.equals("46001")) {
				return 2;
			} else if (iNumeric.equals("46003")) {
				return 3;
			}

		}
		return 1;

	}
}
 

 

二:在MainActivity 中实现LocationCallBack接口,如下:

 

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import com.android.location2.MyLocation.LocationCallBack;
public class MainActivity extends Activity implements LocationCallBack{
private TextView desText;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        desText = (TextView) this.findViewById(R.id.text);
        new MyLocation(MainActivity.this, this);
}
//回调方法
public void onCurrentLocation(double latitude, double longitude) {
desText.setText("当前经度:" + longitude + "\n当前纬度:"+ latitude);
}
    
}
 

 

三:获取经纬度使用的辅助类,这里补贴代码后面直接上传源码:


四:效果如下图:


 

  • 大小: 3.8 KB
  • 大小: 20.6 KB
分享到:
评论
2 楼 LFHhua104 2015-05-01  
楼主,现在是用不了了么?
1 楼 yanzhiwei147 2012-10-28  
HttpResponse resp = client.execute(post);
这句崩掉了

相关推荐

    Android开发之系统信息【5】——获取APN列表

    Android 获取 APN 列表的系统信息 Android 系统中对于 APN 的网络 API 没有公开,但是我们可以通过阅读源代码,然后进行数据库操作,系统会自动监听数据库的变化,从而实现开启或者关闭 APN。 APN(Access Point ...

    android手机APN设置

    Android 手机 APN 设置 APN(Access Point Name)是移动网络中的一个重要概念,它是指移动网络中的一个访问点名称,用于标识移动网络中的一个访问点。Android 手机中的 APN 设置是指在 Android 手机中设置移动网络...

    android 全面解析apn

    数据库中的 APN 信息将被用于匹配 SIM 卡的 MCC 和 MNC,以确定使用哪个 APN。 APN 的实现机制: APN 的实现机制主要包括两个部分:APN 的创建和 APN 的加载。APN 的创建是指将 APN 信息从 XML 文件加载到数据库中...

    android_gps_wifi_基站_定位集合文档

    在Android平台上,GPS(全球定位系统)和其他辅助定位技术如WiFi和基站定位是实现设备位置服务的关键组件。本文档集合了这些技术的整合方法,帮助开发者实现更精确和高效的定位功能。 首先,我们来深入理解GPS定位...

    [Mark安卓教程]Android手机修改APN不保存解决办法.pdf

    ### Android手机修改APN不保存解决办法 #### 一、APN基础知识介绍 APN(Access Point Name,接入点名称)是移动设备访问互联网时必须配置的重要参数之一。它不仅决定了用户通过何种接入方式访问互联网,而且还关联...

    android判断网络状态、网络运营商、网络类型

    在Android开发中,掌握如何判断网络状态、获取网络运营商以及识别网络类型是非常关键的技能,这对于构建具有网络功能的应用程序至关重要。以下将详细介绍这些知识点。 首先,**判断网络状态**是确保应用程序能够...

    android中的APN开发

    在Android系统中,APN(Access Point Name)是网络连接的关键配置,用于定义设备如何接入互联网,特别是通过移动数据。APN包含了网络提供商的名称、数据类型、用户名、密码等信息,这些信息决定了手机如何通过运营商...

    获取和修改手机当前APN

    "获取和修改手机当前APN" 在 Android 系统中,APN(Access Point Name)是手机上网时必须配置的一个参数,它决定了手机通过哪种接入方式来访问网络。APN 保存在数据库中,数据库绝对路径为 `/data/data/...

    Android基于APN获取手机号的方法

    本文实例讲述了Android基于APN获取手机号的方法。分享给大家供大家参考。具体如下: 之前很多人说无法完全获取手机号,是因为现在有的卡不能获取,有的卡能获取,现在我们可以换一种思路来考虑问题,就是用APN的方式...

    Android端APN实现module

    在Android系统中,APN(Access Point Name)是用于设置移动数据网络连接的关键参数,它定义了设备如何连接到互联网,通常包括网络运营商、数据服务类型等信息。本模块主要探讨的是如何在Android应用程序中通过代码来...

    android 设置apn

    大多数Android设备在插入SIM卡后会自动从运营商处获取正确的APN设置。这通常在设备的“网络设置”或“移动网络”菜单下完成。然而,有时自动设置可能不完整或不准确,此时就需要手动干预。 **手动设置APN** 1. 进入...

    对sim卡的基本操作

    - 不同运营商的网络设置可能会有所不同,有时更换SIM卡后需要手动设置APN(Access Point Name),以确保数据服务正常工作。 - APN设置通常包括网络类型、用户名、密码等,这些信息可咨询运营商获取。 7. **SIM卡...

    (安卓)Android获取本机手机号及服务运营商

    在Android开发中,有时我们需要获取用户的手机硬件信息,如手机号码和服务运营商,这些信息对于实现特定功能,如发送短信验证、个性化服务等至关重要。本文将详细介绍如何在Android应用中获取本机手机号及服务运营商...

    mtk modem和sim卡遇到的问题与解决方法.zip

    SIM卡(Subscriber Identity Module)是移动通信设备中的重要组件,存储用户的网络身份信息,使得用户可以在不同设备上享受相同的服务。 标题"mtk modem和sim卡遇到的问题与解决方法.zip"表明这个压缩包文件包含了...

    Android APN开发流程分析.doc

    Android APN 开发流程分析 Android APN 开发流程分析是指 Android 操作系统中数据连接的实现过程,主要涉及到数据连接的建立、维护和管理。以下是 Android APN 开发流程分析的关键知识点: 1. 数据连接流程分析 ...

    android APN 设置

    在Android系统中,APN(Access Point Name)是设置数据连接的关键配置,它定义了设备如何连接到互联网或移动数据网络。APN包含了运营商提供的网络接入点信息,比如网络类型(2G、3G、4G、5G)、用户名、密码、服务器...

    华为4Gwifi路由器泰国三大运营商上网卡APN设置

    本文将详细介绍如何设置华为4G WiFi路由器与泰国三大运营商(Happy卡、AIS卡、True Move卡)的APN参数,以便于在泰国旅游期间实现稳定快速的网络共享。 #### 二、准备工作 1. **华为4G WiFi路由器**:确保设备电量...

    基于android开发的GPS定位

    GPS定位 gps_tip = (TextView) findViewById(R.id.gps_tip); findViewById(R.id.do_gps).setOnClickListener(GpsActivity.this); findViewById(R.id.do_apn).setOnClickListener(GpsActivity.this); ...

Global site tag (gtag.js) - Google Analytics