android WIFI定位和基站定位实现

关于定位原理网上很多,这里就不多说了。下面说怎么实现的,直接贴代码如下:

首先是Util类:

import java.io.BufferedReader;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;


import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;

public class Util {
	//log的标签
	public static final String TAG = "location";
	public static final boolean DEBUG = true;
	public static final String LOCATION_URL = "http://www.google.com/loc/json";
	public static final String LOCATION_HOST = "maps.google.com";
	
	public static void logi(String content){
		if(DEBUG) {
			Log.i(TAG, content);
		}
	}
	
	public static void loge(String content){
		if(DEBUG) {
			Log.e(TAG, content);
		}
	}
	
	public static void logd(String content){
		if(DEBUG) {
			Log.d(TAG, content);
		}
	}
	
	/**
	 * 获取地理位置
	 * 
	 * @throws Exception
	 */
	public static String getLocation(String latitude, String longitude) throws Exception {
		String resultString = "";

		/** 这里采用get方法,直接将参数加到URL上 */
		String urlString = String.format("http://maps.google.cn/maps/geo?key=abcdefg&q=%s,%s", latitude, longitude);
		Util.logi("Util: getLocation: 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;
		}

		return resultString;
	}
	
	/**
	 * 判断网络是否可用
	 * @param context
	 * @return
	 */
	public static boolean isNetworkAvaliable(Context context){
		ConnectivityManager manager = (ConnectivityManager) (context
				.getSystemService(Context.CONNECTIVITY_SERVICE));
		NetworkInfo networkinfo = manager.getActiveNetworkInfo();
		return !(networkinfo == null || !networkinfo.isAvailable());
	}
	
	/**
	 * 判断网络类型 wifi  3G
	 * 
	 * @param context
	 * @return
	 */
	public static  boolean isWifiNetwrokType(Context context) {
		ConnectivityManager connectivityManager = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo info = connectivityManager.getActiveNetworkInfo();

		if (info != null && info.isAvailable()) {
			if (info.getTypeName().equalsIgnoreCase("wifi")) {
				return true;
			} 
		}
		return false;
	}
}

在MainActivity中根据当前网络环境,决定用WIFI定位还是基站定位

import com.demo.location.cell.CellLocationManager;
import com.demo.location.wifi.WifiLocationManager;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
	
	private TextView mTextView;
	private Button mButton;
	private WifiLocationManager wifiLocation;
	private CellLocationManager cellLocation;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mTextView = (TextView) findViewById(R.id.tv_show_info);
        mButton = (Button) findViewById(R.id.btn_get_info);
        wifiLocation = new WifiLocationManager(MainActivity.this);
        cellLocation = new CellLocationManager(MainActivity.this);
        
        mButton.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Util.logi("MainActivity: on mButton Click!!!");
				getLocation();
			}
        	
        });
    }
    
    private void getLocation(){
    	boolean isNet = Util.isNetworkAvaliable(MainActivity.this);
    	if(!isNet){
    		Toast.makeText(MainActivity.this, "网络不可用:打开WIFI 或 数据连接!!!", Toast.LENGTH_LONG).show();
    		Util.logd("MainActivity: getLocation: Net work is not avaliable, and return!!!");
    		return;
    	}
    	boolean isWifi = Util.isWifiNetwrokType(MainActivity.this);
    	if(isWifi){
    		Util.logd("MainActivity: getLocation: Wifi定位");
    		wifiLocation.getLocation(new WifiReceiver());
    	}else{
    		Util.logd("MainActivity: getLocation: 基站定位");
    		String location = cellLocation.getLocationCell();
        	mTextView.setText(location);
    	}
    }
    
	
    class WifiReceiver extends BroadcastReceiver {
		public void onReceive(Context c, Intent intent) {
			Util.logi("get broadcastReceiver: SCAN_RESULTS_AVAILABLE_ACTION");
			String location = wifiLocation.getLocationWifi();
			mTextView.setText(location);
		}
	}
}


1. WIFI定位:

WIFI定位的实现在WifiLocationManager.java里

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
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 com.demo.location.Util;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;

public class WifiLocationManager {

	private Context mContext;
	private WifiManager wifiManager;

	public WifiLocationManager(Context context){
		mContext = context;
		wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
	}
	
	public void getLocation(BroadcastReceiver receiver){
		mContext.registerReceiver(receiver, new IntentFilter(
				WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
		wifiManager.startScan();
	}
	
	public List<ScanResult> getWifiList(){
		return wifiManager.getScanResults();
	}
	
	public String getLocationWifi(){

		/** 采用Android默认的HttpClient */
		HttpClient client = new DefaultHttpClient();
		/** 采用POST方法 */
		HttpPost post = new HttpPost(Util.LOCATION_URL);
		try {
			/** 构造POST的JSON数据 */
			JSONObject holder = new JSONObject();
			holder.put("version", "1.1.0");
			holder.put("host", Util.LOCATION_HOST);
			holder.put("address_language", "zh_CN");
			holder.put("request_address", true);

			JSONArray towerarray = new JSONArray();
			List<ScanResult> wifiList = getWifiList();
			for (int i = 0; i < wifiList.size(); i++) {
				JSONObject tower = new JSONObject();
				tower.put("mac_address", wifiList.get(i).BSSID);
				tower.put("ssid", wifiList.get(i).SSID);
				tower.put("signal_strength", wifiList.get(i).level);
				towerarray.put(tower);
			}
			
			holder.put("wifi_towers", towerarray);
			Util.logd("holder.put: " + holder.toString());
			
			StringEntity query = new StringEntity(holder.toString());
			post.setEntity(query);

			/** 发出POST数据并获取返回数据 */
			HttpResponse response = client.execute(post);
			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);
			}
			Util.logd("result: " + strBuff.toString());
			
			/** 解析返回的JSON数据获得经纬度 */
			JSONObject json = new JSONObject(strBuff.toString());
			JSONObject subjosn = new JSONObject(json.getString("location"));

			String latitude = subjosn.getString("latitude");
			String longitude = subjosn.getString("longitude");
			
			return Util.getLocation(latitude, longitude);
			
		} catch(ClientProtocolException e){
			Util.loge("ClientProtocolException : " + e.getMessage());
		}catch(IOException e){
			Util.loge("IOException : " + e.getMessage());
		} catch (Exception e) {
			Util.loge("Exception : " + e.getMessage());
		} finally{
			post.abort();
			client = null;
		}
		return null;
    }
}

2.基站定位

基站定位的实现在CellLocationManager.java中

import java.io.BufferedReader;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
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 com.demo.location.Util;

import android.content.Context;
import android.telephony.TelephonyManager;
import android.telephony.gsm.GsmCellLocation;


public class CellLocationManager {

	private Context mContext;
	public CellLocationManager(Context context){
		mContext = context;
	}
	
	/** 基站信息结构体 */
    public class SCell{
    	public int MCC;
    	public int MNC;
    	public int LAC;
    	public int CID;
    }
    
    /**
	 * 获取基站信息
	 * 
	 * @throws Exception
	 */
	private SCell getCellInfo() throws Exception {
		SCell cell = new SCell();

		/** 调用API获取基站信息 */
		TelephonyManager mTelNet = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
		GsmCellLocation location = (GsmCellLocation) mTelNet.getCellLocation();
		if (location == null)
			throw new Exception("获取基站信息失败");

		String operator = mTelNet.getNetworkOperator();
		int mcc = Integer.parseInt(operator.substring(0, 3));
		int mnc = Integer.parseInt(operator.substring(3));
		int cid = location.getCid();
		int lac = location.getLac();

		/** 将获得的数据放到结构体中 */
		cell.MCC = mcc;
		cell.MNC = mnc;
		cell.LAC = lac;
		cell.CID = cid;

		return cell;
	}
    
    public String getLocationCell(){

    	SCell cell = null;
		try {
			cell = getCellInfo();
		} catch (Exception e1) {
			Util.loge("getLocationCell: getCellInfo: error: " + e1.getMessage());
			return null;
		}
		/** 采用Android默认的HttpClient */
		HttpClient client = new DefaultHttpClient();
		/** 采用POST方法 */
		HttpPost post = new HttpPost(Util.LOCATION_URL);
		
		try {
			/** 构造POST的JSON数据 */
			JSONObject holder = new JSONObject();
			holder.put("version", "1.1.0");
			holder.put("host", Util.LOCATION_HOST);
			holder.put("address_language", "zh_CN");
			holder.put("request_address", true);
			holder.put("radio_type", "gsm");
			holder.put("carrier", "HTC");

			JSONObject tower = new JSONObject();
			tower.put("mobile_country_code", cell.MCC);
//			Util.logi("getLocationCell: mobile_country_code = " + cell.MCC );
			tower.put("mobile_network_code", cell.MNC);
//			Util.logi("getLocationCell: mobile_network_code = " + cell.MNC );
			tower.put("cell_id", cell.CID);
//			Util.logi("getLocationCell: cell_id = " + cell.CID );
			tower.put("location_area_code", cell.LAC);
//			Util.logi("getLocationCell: location_area_code = " + cell.LAC );

			JSONArray towerarray = new JSONArray();
			towerarray.put(tower);
			holder.put("cell_towers", towerarray);

			StringEntity query = new StringEntity(holder.toString());
			Util.logi("getLocationCell: holder: " + holder.toString());
			post.setEntity(query);

			/** 发出POST数据并获取返回数据 */
			HttpResponse response = client.execute(post);
			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);
			}

			/** 解析返回的JSON数据获得经纬度 */
			JSONObject json = new JSONObject(strBuff.toString());
			JSONObject subjosn = new JSONObject(json.getString("location"));

			String latitude = subjosn.getString("latitude");
			String longitude = subjosn.getString("longitude");
			
			return Util.getLocation(latitude, longitude);
			
		} catch (Exception e) {
			Util.loge("getLocationCell: error: " + e.getMessage());
		} finally{
			post.abort();
			client = null;
		}
		
    	return null;
    }
    
    
}


下载源代码请到: http://download.csdn.net/detail/liu_zhen_wei/4768794 

你可能感兴趣的:(android WIFI定位和基站定位实现)