`
maozilee
  • 浏览: 252648 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Android 基于GeolocationAPI的基站定位【转】

阅读更多

 

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

  • 大小: 19.8 KB
分享到:
评论

相关推荐

    Android基于GeolocationAPI的基站定位

    综上所述,Android基于GeolocationAPI的基站定位涉及到网络通信、JSON解析、UI更新以及权限管理等多个方面,需要开发者对Android系统和网络编程有深入理解。在实际应用中,还需要考虑到不同设备、网络环境的差异,...

    google基站定位JAVA代码

    总的来说,Google基站定位Java代码涉及到的主要知识点包括:Android系统的TelephonyManager类,Google Maps Geolocation API的使用,基站信息的获取,以及API请求和响应的处理。在实际开发中,还需要考虑API调用频率...

    HTML5 geoLocation API

    HTML5的地理定位功能演示

    geolocation-api

    全球定位API(Geolocation API)是Web开发中的一个重要工具,它允许Web应用程序获取用户设备的地理位置信息,为实现基于位置的服务提供了便利。这一API是W3C组织制定的标准,旨在提高网页与移动应用的地理定位功能,...

    react-native-geolocation:React Native的地理位置API

    当前,在Android上,它使用 。 Google不推荐使用此API,因为它不如推荐的准确和慢。 这是我们希望在不久的将来更改的内容 。 为了将新的与React Native一起使用,请查看替代库: 入门 yarn add @react-native-...

    geolocationAPI:玩HTML5地理位置API和Google Maps

    一个简单的学习项目,使我的脑袋环绕HTML5地理位置API和Google Maps。 包括Bootstrap 3,Angularjs,angular-google-maps和lodash。 使用Surge.sh托管

    nokia-gsm-location-hacks:用 Python 为运行 Symbian 60 的诺基亚手机编写的一系列黑客攻击

    诺基亚 GSM 定位黑客 用 Python 编写的一组黑客,使运行 Symbian 60 的诺基亚手机记录(和报告) 蜂窝信息及其地理等效信息。 该软件基于 py60 Python 浅蓝 谷歌齿轮 手机使用 Py60 收集数据(如 、 、 和 ),...

    GoogleMaps:显示设备位置

    3. **定位用户**:使用`GeolocationApi`来获取设备的位置信息。这通常需要用户的同意,因为涉及位置权限。一旦得到许可,API会返回包含经度和纬度的`LatLng`对象。 4. **搜索附近地点**:有了用户的位置信息后,...

    HTML5移动开发即学即用

    最后,第11章介绍GeolocationAPI,用于获取用户的地理位置信息,并结合GoogleMapsAPI实现具体应用。 本书可作为HTML5开发的工具书和学习读物,书中的源代码可以在支持网站下载。书籍的编写由多位计算机专业的副教授...

    php切换地区php切换地区php切换地区php切换地区

    8. **地理定位**:可以使用JavaScript库(如`geoip-js`或`geolocationapi`)获取用户的IP地址,然后通过IP查找服务(如MaxMind)推测用户可能所在的地区。 9. **Cookie**:除了会话,还可以使用Cookie保存用户的...

    差距:已检查Google Maps API

    差距 Google API检查器。... GeolocationAPI RouteToTraveledAPI SpeedLimitRoadsAPI PlaceDetailsAPI NearbySearchPlacesAPI TextSearchPlacesAPI PlacesPhotoAPI PlayableLocationsAPI FCMAPI

Global site tag (gtag.js) - Google Analytics