基站定位程序


贴代码
LauncherActivity.java
package com.android.demo;

import java.util.Timer;
import java.util.TimerTask;


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;


public class LauncherActivity extends Activity{


	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.launcher);
		
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				Intent goIntent = new Intent();
				goIntent.setClass(LauncherActivity.this, DemoActivity.class);
				startActivity(goIntent);
			}
		}, 3*1000);
	}
}


DemoActivity.java
package com.android.demo;
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.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.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.telephony.TelephonyManager;
import android.telephony.gsm.GsmCellLocation;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.view.View.OnClickListener;

public class DemoActivity extends Activity {
	private MyHandler myHandler;
	private SCell cell;
	private ProgressDialog mProgressDialog;
	/** 根据基站数据获取经纬度 */
	private SItude itude;
	/** 获取地理位置 */
	private String location;
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		/** 为按钮绑定事件 */
		Button btnGetLocation = (Button) findViewById(R.id.button1);
		btnGetLocation.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				onBtnClick();
			}
		});
	}
	/** 基站信息结构体 */
	public class SCell{
		public int MCC;
		public int MNC;
		public int LAC;
		public int CID;
	}
	/** 经纬度信息结构体 */
	public class SItude{
		public String latitude;
		public String longitude;
	}
	/** 按钮点击回调函数 */
	private void onBtnClick() {
		/** 弹出一个等待状态的框 */
		myHandler=new MyHandler();
		Toast.makeText(getApplicationContext(), "Ha", Toast.LENGTH_SHORT).show();
		mProgressDialog = new ProgressDialog(this);
		mProgressDialog.setMessage("正在获取中...");
		mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
		mProgressDialog.show();
		MyThread m = new MyThread();  
		new Thread(m).start();
	}
	/**
	 * 获取基站信息
	 * 
	 * @throws Exception
	 */
	private SCell getCellInfo() throws Exception {
		SCell cell = new SCell();
		/** 调用API获取基站信息 */
		TelephonyManager mTelNet = (TelephonyManager) 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;
	}
	/**
	 * 获取经纬度
	 * 
	 * @throws Exception
	 */
	private SItude getItude(SCell cell) throws Exception {
		SItude itude = new SItude();
		/** 采用Android默认的HttpClient */
		HttpClient client = new DefaultHttpClient();
		/** 采用POST方法 */
		HttpPost post = new HttpPost("http://www.google.com/loc/json");
		try {
			/** 构造POST的JSON数据 */
			JSONObject holder = new JSONObject();
			holder.put("version", "1.1.0");
			holder.put("host", "maps.google.com");
			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);
			tower.put("mobile_network_code", cell.MNC);
			tower.put("cell_id", cell.CID);
			tower.put("location_area_code", cell.LAC);
			JSONArray towerarray = new JSONArray();
			towerarray.put(tower);
			holder.put("cell_towers", towerarray);
			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);
			}
			/** 解析返回的JSON数据获得经纬度 */
			JSONObject json = new JSONObject(strBuff.toString());
			JSONObject subjosn = new JSONObject(json.getString("location"));
			itude.latitude = subjosn.getString("latitude");
			itude.longitude = subjosn.getString("longitude");
			Log.i("Itude", itude.latitude + itude.longitude);
		} catch (Exception e) {
			Log.e(e.getMessage(), e.toString());
			throw new Exception("获取经纬度出现错误:"+e.getMessage());
		} finally{
			post.abort();
			client = null;
		}
		return itude;
	}
	/**
	 * 获取地理位置
	 * 
	 * @throws Exception
	 */
	private String getLocation(SItude itude) throws Exception {
		String resultString = "";
		/** 这里采用get方法,直接将参数加到URL上 */
		String urlString = String.format("http://maps.google.cn/maps/geo?key=abcdefg&q=%s,%s", itude.latitude, itude.longitude);
		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;
		}
		return resultString;
	}
	/** 显示结果 */
	private void showResult(SCell cell, String location,SItude itude) {
		TextView cellText = (TextView) findViewById(R.id.cellText);
		cellText.setText(String.format("基站信息:mcc:%d, mnc:%d, lac:%d, cid:%d",
				cell.MCC, cell.MNC, cell.LAC, cell.CID));
		TextView locationText = (TextView) findViewById(R.id.lacationText);
		locationText.setText("物理位置:" + location);
		TextView itudeText=(TextView)findViewById(R.id.itudeText); 
		itudeText.setText("经度:"+itude.latitude+"  纬度:"+itude.longitude);
	}
	class MyHandler extends Handler {  
		public MyHandler() {  
		}  
		public MyHandler(Looper L) {  
			super(L);  
		}  
		// 子类必须重写此方法,接管数据  
		@Override  
		public void handleMessage(Message msg) {  
			// TODO Auto-generated method stub  
			Log.d("MyHandler", "handleMessage......");
			/** 显示结果 */		
			mProgressDialog.dismiss();
			if(msg.arg1==1)
			{
				showResult(cell, location,itude);
			}
			super.handleMessage(msg);  
			// 此处可以更新UI  
		}  
	}  
	class MyThread implements Runnable {  
		public void run() { 
			Message msg = new Message();  
			msg.arg1=1;
			try {  
				/** 获取基站数据 */
				cell = getCellInfo();
				/** 根据基站数据获取经纬度 */
				itude = getItude(cell);
				/** 获取地理位置 */
				location = getLocation(itude);
				/** 关闭对话框 */  
				msg.arg1=1;
				myHandler.sendMessage(msg); // 向Handler发送消息,更新UI 
			} catch (InterruptedException e) {  
				// TODO Auto-generated catch block  
				/** 显示错误 */
				TextView cellText = (TextView) findViewById(R.id.cellText);
				cellText.setText(e.getMessage());
				Log.e("Error", e.getMessage()); 
				
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			Log.d("thread.......", "mThread........");  
			 
		}  
	}
}

猜你喜欢

转载自iaiai.iteye.com/blog/2172741