package com.mopa.LocationMe; import java.io.BufferedReader; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; 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.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; 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.Environment; import android.os.Handler; import android.os.Looper; import android.telephony.TelephonyManager; import android.telephony.gsm.GsmCellLocation; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; import android.widget.TextView; public class LocationMe extends Activity { /** * mTxtLocal显示结果 * mLocalOkListener接口对象的引用 * mProgressDialog进度条 * HttpClient,HttpParams * timeout超时设置 */ private TextView mTxtLocal=null; private OnGetLocalOkListener mLocalOkListener=null; private ProgressDialog mProgressDialog = null; private HttpClient httpclient; private HttpParams httpParameters; private int timeoutConnection = 3000; private int timeoutSocket = 5000; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //布局 RelativeLayout mRlayout=new RelativeLayout(this); LayoutParams params=new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.ALIGN_PARENT_TOP); params.addRule(RelativeLayout.ALIGN_PARENT_LEFT); Button mBtnGetLocal=new Button(this); mBtnGetLocal.setText("Get Me-Location."); mRlayout.addView(mBtnGetLocal,params); mBtnGetLocal.setId(11); //设置onClickListener监听事件 mBtnGetLocal.setOnClickListener(mOnClickListener); params=new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.BELOW,11); mTxtLocal=new TextView(this); mRlayout.addView(mTxtLocal,params); setContentView(mRlayout); } //监听对象,这里是个匿名内部类. private OnClickListener mOnClickListener=new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub getItude(); }//end onClick; }; //通过经纬度获取地理信息 private void getLocalByItude(String latitude,String longitude) { HttpURLConnection conn = null; String line=null; try { URL url=new URL("http://maps.google.cn/maps/geo?key=abcdefg&q=" + latitude + "," + longitude); conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); conn.setUseCaches(false); conn.setConnectTimeout(timeoutConnection); conn.setReadTimeout(timeoutSocket); conn.setRequestMethod("GET"); InputStream inputStream=conn.getInputStream(); InputStreamReader inStreamReader=new InputStreamReader(inputStream,"utf-8"); BufferedReader bufReader=new BufferedReader(inStreamReader); StringBuffer bufStr=new StringBuffer(); while((line=bufReader.readLine())!=null) { bufStr.append(line); } line=bufStr.toString(); if(line!=null&&line.length()>0) { JSONObject jsonobject = new JSONObject(line); JSONArray jsonArray = new JSONArray(jsonobject.get("Placemark") .toString()); line=""; for (int i = 0; i < jsonArray.length(); i++) { line=jsonArray.getJSONObject(i).getString("address"); } //回调 mLocalOkListener.onGetOk(line); } } catch (Exception e) { // TODO: handle exception mLocalOkListener.onGetOk(""); } finally{ if(conn!=null) { conn.disconnect(); mLocalOkListener.onGetOk(line); } } } //获得主线程的Handler private Handler mHandler=new Handler(Looper.getMainLooper()); private void getItude() { mProgressDialog = new ProgressDialog(this); mProgressDialog.setMessage("正在获取中..."); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); mProgressDialog.show(); //匿名内部类,回调调用的函数 this.setOnGetLocalOkListener(new OnGetLocalOkListener() { @Override public void onGetOk(String local) { // TODO Auto-generated method stub final String mlocal=local; mHandler.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub if(mlocal.length()>0) { mTxtLocal.setText(mlocal); System.out.println("onGetOk........"); new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub saveLocal(mlocal); } }).start(); mProgressDialog.dismiss(); } else { mTxtLocal.setText("获取位置失败,请检查网络是否开启"); mProgressDialog.dismiss(); } } }); } }); //开启新的线程去获取经纬度 new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub TelephonyManager mTelNet = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); String operator=mTelNet.getNetworkOperator(); String mcc=operator.substring(0,3); String mnc=operator.substring(3); GsmCellLocation location=(GsmCellLocation)mTelNet.getCellLocation(); int cid=location.getCid(); int lac=location.getLac(); httpParameters = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); httpclient = new DefaultHttpClient(httpParameters); HttpPost post=new HttpPost("http://www.google.com/loc/json"); try { 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); JSONObject tower=new JSONObject(); tower.put("mobile_country_code", mcc); tower.put("mobile_network_code", mnc); tower.put("cell_id", cid); tower.put("location_area_code", lac); JSONArray towerarray=new JSONArray(); towerarray.put(tower); holder.put("cell_towers", towerarray); StringEntity query=new StringEntity(holder.toString()); post.setEntity(query); HttpResponse response=httpclient.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); } JSONObject json=new JSONObject(strBuff.toString()); JSONObject subjosn=new JSONObject(json.getString("location")); getLocalByItude(subjosn.getString("latitude"),subjosn.getString("longitude")); } catch (Exception e) { // TODO: handle exception mLocalOkListener.onGetOk(""); } finally{ post.abort(); httpclient=null; } } }).start(); } FileWriter mFileWriter=null; //写文件,保存刚才获取成功的地理位置 public void saveLocal(String local) { // TODO Auto-generated method stub try { String strFiles=Environment.getExternalStorageDirectory().toString()+"/Local/"; File outDir=new File(strFiles); File outFile=new File(strFiles+"LocalMe.txt"); if(outDir.exists()==false) { outDir.mkdirs(); } System.out.println(outFile.getAbsolutePath()); if(outFile.exists()==false) { System.out.println("outFile.exists()==false"); outFile.createNewFile(); } System.out.println(outFile.getAbsolutePath()); mFileWriter=new FileWriter(outFile,true); //加入日期 Date date = new Date(); SimpleDateFormat sDataForamat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA); String strTime = sDataForamat.format(date); mFileWriter.write(strTime+":"+local+"\n"); } catch (IOException e) { // TODO: handle exception e.printStackTrace(); }finally { if(mFileWriter!=null) { try { mFileWriter.close(); } catch (IOException e2) { // TODO: handle exception } } } } //设置监听类的引用对象 public void setOnGetLocalOkListener(OnGetLocalOkListener listener) { mLocalOkListener = listener; } //监听类接口 public interface OnGetLocalOkListener { void onGetOk(String local); } }
来源:http://www.cnblogs.com/patui/archive/2011/09/10/2173434.html