博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android进阶篇-百度地图获取地理信息
阅读量:5925 次
发布时间:2019-06-19

本文共 19668 字,大约阅读时间需要 65 分钟。

Android中获取用户的地理信息的方式有很多种,各有各得优点和缺点。

这里主要介绍的方法是通过调用百度提供的地图API获取用户的地理位置信息。

首要不可缺少的还是百度提供的标准Application类

public class BMapApiApplication extends Application {        public static BMapApiApplication mDemoApp;        public static float mDensity;        //百度MapAPI的管理类    public BMapManager mBMapMan = null;        // 授权Key    // TODO: 请输入您的Key,    // 申请地址:http://dev.baidu.com/wiki/static/imap/key/    public String mStrKey = "F9FBF9FAA9BA37C0C6085BD280723A659EC51B20";    public boolean m_bKeyRight = true;    // 授权Key正确,验证通过        // 常用事件监听,用来处理通常的网络错误,授权验证错误等    public static class MyGeneralListener implements MKGeneralListener {        @Override        public void onGetNetworkState(int iError) {            Toast.makeText(BMapApiApplication.mDemoApp.getApplicationContext(), "您的网络出错啦!",                    Toast.LENGTH_LONG).show();        }        @Override        public void onGetPermissionState(int iError) {            if (iError ==  MKEvent.ERROR_PERMISSION_DENIED) {                // 授权Key错误:                Toast.makeText(BMapApiApplication.mDemoApp.getApplicationContext(),                         "请在BMapApiDemoApp.java文件输入正确的授权Key!",                        Toast.LENGTH_LONG).show();                BMapApiApplication.mDemoApp.m_bKeyRight = false;            }        }            }        @Override    public void onCreate() {        mDemoApp = this;        mBMapMan = new BMapManager(this);        mBMapMan.init(this.mStrKey, new MyGeneralListener());                mDensity = getResources().getDisplayMetrics().density;                super.onCreate();    }        @Override    //建议在您app的退出之前调用mapadpi的destroy()函数,避免重复初始化带来的时间消耗    public void onTerminate() {        // TODO Auto-generated method stub        if (mBMapMan != null) {            mBMapMan.destroy();            mBMapMan = null;        }        super.onTerminate();    }}

然后是通过注册百度地图调用相应的接口获取经纬度获取相应的信息

/** Called when the activity is first created. */    /** 上下文 */    private BMapApiApplication mApplication;    /** 定义搜索服务类 */    private MKSearch mMKSearch;        /** 记录当前经纬度的MAP*/    private HashMap
mCurLocation = new HashMap
(); //城市名 private String cityName; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mApplication = (BMapApiApplication) this.getApplication(); if (mApplication.mBMapMan == null) { mApplication.mBMapMan = new BMapManager(getApplication()); mApplication.mBMapMan.init(mApplication.mStrKey, new BMapApiApplication.MyGeneralListener()); } /** 初始化MKSearch */ mMKSearch = new MKSearch(); mMKSearch.init(mApplication.mBMapMan, new MySearchListener()); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); this.registerLocationListener(); } private void registerLocationListener() { mApplication.mBMapMan.getLocationManager().requestLocationUpdates( mLocationListener); if (mApplication.mBMapMan != null) { /** 开启百度地图API */ mApplication.mBMapMan.start(); } } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); this.unRegisterLocationListener(); } private void unRegisterLocationListener() { mApplication.mBMapMan.getLocationManager().removeUpdates( mLocationListener); if (mApplication.mBMapMan != null) { /** 终止百度地图API */ mApplication.mBMapMan.stop(); } } @Override protected void onDestroy() { if (mApplication.mBMapMan != null) { /** 程序退出前需调用此方法 */ mApplication.mBMapMan.destroy(); mApplication.mBMapMan = null; } super.onDestroy(); } /** 注册定位事件 */ private LocationListener mLocationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub if (location != null) { try { int longitude = (int) (1000000 * location.getLongitude()); int latitude = (int) (1000000 * location.getLatitude()); /** 保存当前经纬度 */ mCurLocation.put("longitude", location.getLongitude()); mCurLocation.put("latitude", location.getLatitude()); GeoPoint point = new GeoPoint(latitude, longitude); /** 查询该经纬度值所对应的地址位置信息 */ Weather_WelcomeActivity.this.mMKSearch .reverseGeocode(new GeoPoint(latitude, longitude)); } catch (Exception e) { e.printStackTrace(); } } } }; /** 内部类实现MKSearchListener接口,用于实现异步搜索服务 */ private class MySearchListener implements MKSearchListener { @Override public void onGetAddrResult(MKAddrInfo result, int iError) { if( iError != 0 || result == null){ Toast.makeText(Weather_WelcomeActivity.this, "获取地理信息失败", Toast.LENGTH_LONG).show(); }else { Log.info("json", "result= " + result); cityName =result.addressComponents.city; Bundle bundle = new Bundle(); bundle.putString("cityName", cityName.substring(0, cityName.lastIndexOf("市"))); Intent intent = new Intent(Weather_WelcomeActivity.this,Weather_MainActivity.class); intent.putExtras(bundle); startActivity(intent); Weather_WelcomeActivity.this.finish(); } } @Override public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) { } @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { } @Override public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) { } @Override public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) { } }

其他方式获取当前的城市名:

/**     * 抓取当前的城市信息     *      * @return String 城市名     */    public String getCurrentCityName(){        String city = "";        TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);        GsmCellLocation glc = (GsmCellLocation) telManager.getCellLocation();                if (glc != null){            int cid = glc.getCid(); // value 基站ID号            int lac = glc.getLac();// 写入区域代码            String strOperator = telManager.getNetworkOperator();            int mcc = Integer.valueOf(strOperator.substring(0, 3));// 写入当前城市代码            int mnc = Integer.valueOf(strOperator.substring(3, 5));// 写入网络代码            String getNumber = "";            getNumber += ("cid:" + cid + "\n");            getNumber += ("cid:" + lac + "\n");            getNumber += ("cid:" + mcc + "\n");            getNumber += ("cid:" + mnc + "\n");            DefaultHttpClient client = new DefaultHttpClient();            BasicHttpParams params = new BasicHttpParams();            HttpConnectionParams.setSoTimeout(params, 20000);            HttpPost post = new HttpPost("http://www.google.com/loc/json");                        try{                JSONObject jObject = new JSONObject();                jObject.put("version", "1.1.0");                jObject.put("host", "maps.google.com");                jObject.put("request_address", true);                if (mcc == 460)                    jObject.put("address_language", "zh_CN");                else                    jObject.put("address_language", "en_US");                JSONArray jArray = new JSONArray();                JSONObject jData = new JSONObject();                jData.put("cell_id", cid);                jData.put("location_area_code", lac);                jData.put("mobile_country_code", mcc);                jData.put("mobile_network_code", mnc);                jArray.put(jData);                jObject.put("cell_towers", jArray);                StringEntity se = new StringEntity(jObject.toString());                post.setEntity(se);                HttpResponse resp = client.execute(post);                BufferedReader br = null;                if (resp.getStatusLine().getStatusCode() == HttpStatus.SC_OK){                    br = new BufferedReader(new InputStreamReader(resp                            .getEntity().getContent()));                    StringBuffer sb = new StringBuffer();                    String result = br.readLine();                    while (result != null){                        sb.append(getNumber);                        sb.append(result);                        result = br.readLine();                    }                    String s = sb.toString();                    s = s.substring(s.indexOf("{
")); JSONObject jo = new JSONObject(s); JSONObject arr = jo.getJSONObject("location"); JSONObject address = arr.getJSONObject("address"); city = address.getString("city"); } } catch (JSONException e){ e.printStackTrace(); } catch (UnsupportedEncodingException e){ e.printStackTrace(); } catch (ClientProtocolException e){ e.printStackTrace(); } catch (IOException e){ e.printStackTrace(); } finally{ post.abort(); client = null; } } return city; }

 加入这两个权限:

。!

Android中获取用户的地理信息的方式有很多种,各有各得优点和缺点。

这里主要介绍的方法是通过调用百度提供的地图API获取用户的地理位置信息。

首要不可缺少的还是百度提供的标准Application类

public class BMapApiApplication extends Application {        public static BMapApiApplication mDemoApp;        public static float mDensity;        //百度MapAPI的管理类    public BMapManager mBMapMan = null;        // 授权Key    // TODO: 请输入您的Key,    // 申请地址:http://dev.baidu.com/wiki/static/imap/key/    public String mStrKey = "F9FBF9FAA9BA37C0C6085BD280723A659EC51B20";    public boolean m_bKeyRight = true;    // 授权Key正确,验证通过        // 常用事件监听,用来处理通常的网络错误,授权验证错误等    public static class MyGeneralListener implements MKGeneralListener {        @Override        public void onGetNetworkState(int iError) {            Toast.makeText(BMapApiApplication.mDemoApp.getApplicationContext(), "您的网络出错啦!",                    Toast.LENGTH_LONG).show();        }        @Override        public void onGetPermissionState(int iError) {            if (iError ==  MKEvent.ERROR_PERMISSION_DENIED) {                // 授权Key错误:                Toast.makeText(BMapApiApplication.mDemoApp.getApplicationContext(),                         "请在BMapApiDemoApp.java文件输入正确的授权Key!",                        Toast.LENGTH_LONG).show();                BMapApiApplication.mDemoApp.m_bKeyRight = false;            }        }            }        @Override    public void onCreate() {        mDemoApp = this;        mBMapMan = new BMapManager(this);        mBMapMan.init(this.mStrKey, new MyGeneralListener());                mDensity = getResources().getDisplayMetrics().density;                super.onCreate();    }        @Override    //建议在您app的退出之前调用mapadpi的destroy()函数,避免重复初始化带来的时间消耗    public void onTerminate() {        // TODO Auto-generated method stub        if (mBMapMan != null) {            mBMapMan.destroy();            mBMapMan = null;        }        super.onTerminate();    }}

然后是通过注册百度地图调用相应的接口获取经纬度获取相应的信息

/** Called when the activity is first created. */    /** 上下文 */    private BMapApiApplication mApplication;    /** 定义搜索服务类 */    private MKSearch mMKSearch;        /** 记录当前经纬度的MAP*/    private HashMap
mCurLocation = new HashMap
(); //城市名 private String cityName; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mApplication = (BMapApiApplication) this.getApplication(); if (mApplication.mBMapMan == null) { mApplication.mBMapMan = new BMapManager(getApplication()); mApplication.mBMapMan.init(mApplication.mStrKey, new BMapApiApplication.MyGeneralListener()); } /** 初始化MKSearch */ mMKSearch = new MKSearch(); mMKSearch.init(mApplication.mBMapMan, new MySearchListener()); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); this.registerLocationListener(); } private void registerLocationListener() { mApplication.mBMapMan.getLocationManager().requestLocationUpdates( mLocationListener); if (mApplication.mBMapMan != null) { /** 开启百度地图API */ mApplication.mBMapMan.start(); } } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); this.unRegisterLocationListener(); } private void unRegisterLocationListener() { mApplication.mBMapMan.getLocationManager().removeUpdates( mLocationListener); if (mApplication.mBMapMan != null) { /** 终止百度地图API */ mApplication.mBMapMan.stop(); } } @Override protected void onDestroy() { if (mApplication.mBMapMan != null) { /** 程序退出前需调用此方法 */ mApplication.mBMapMan.destroy(); mApplication.mBMapMan = null; } super.onDestroy(); } /** 注册定位事件 */ private LocationListener mLocationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub if (location != null) { try { int longitude = (int) (1000000 * location.getLongitude()); int latitude = (int) (1000000 * location.getLatitude()); /** 保存当前经纬度 */ mCurLocation.put("longitude", location.getLongitude()); mCurLocation.put("latitude", location.getLatitude()); GeoPoint point = new GeoPoint(latitude, longitude); /** 查询该经纬度值所对应的地址位置信息 */ Weather_WelcomeActivity.this.mMKSearch .reverseGeocode(new GeoPoint(latitude, longitude)); } catch (Exception e) { e.printStackTrace(); } } } }; /** 内部类实现MKSearchListener接口,用于实现异步搜索服务 */ private class MySearchListener implements MKSearchListener { @Override public void onGetAddrResult(MKAddrInfo result, int iError) { if( iError != 0 || result == null){ Toast.makeText(Weather_WelcomeActivity.this, "获取地理信息失败", Toast.LENGTH_LONG).show(); }else { Log.info("json", "result= " + result); cityName =result.addressComponents.city; Bundle bundle = new Bundle(); bundle.putString("cityName", cityName.substring(0, cityName.lastIndexOf("市"))); Intent intent = new Intent(Weather_WelcomeActivity.this,Weather_MainActivity.class); intent.putExtras(bundle); startActivity(intent); Weather_WelcomeActivity.this.finish(); } } @Override public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) { } @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { } @Override public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) { } @Override public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) { } }

其他方式获取当前的城市名:

/**     * 抓取当前的城市信息     *      * @return String 城市名     */    public String getCurrentCityName(){        String city = "";        TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);        GsmCellLocation glc = (GsmCellLocation) telManager.getCellLocation();                if (glc != null){            int cid = glc.getCid(); // value 基站ID号            int lac = glc.getLac();// 写入区域代码            String strOperator = telManager.getNetworkOperator();            int mcc = Integer.valueOf(strOperator.substring(0, 3));// 写入当前城市代码            int mnc = Integer.valueOf(strOperator.substring(3, 5));// 写入网络代码            String getNumber = "";            getNumber += ("cid:" + cid + "\n");            getNumber += ("cid:" + lac + "\n");            getNumber += ("cid:" + mcc + "\n");            getNumber += ("cid:" + mnc + "\n");            DefaultHttpClient client = new DefaultHttpClient();            BasicHttpParams params = new BasicHttpParams();            HttpConnectionParams.setSoTimeout(params, 20000);            HttpPost post = new HttpPost("http://www.google.com/loc/json");                        try{                JSONObject jObject = new JSONObject();                jObject.put("version", "1.1.0");                jObject.put("host", "maps.google.com");                jObject.put("request_address", true);                if (mcc == 460)                    jObject.put("address_language", "zh_CN");                else                    jObject.put("address_language", "en_US");                JSONArray jArray = new JSONArray();                JSONObject jData = new JSONObject();                jData.put("cell_id", cid);                jData.put("location_area_code", lac);                jData.put("mobile_country_code", mcc);                jData.put("mobile_network_code", mnc);                jArray.put(jData);                jObject.put("cell_towers", jArray);                StringEntity se = new StringEntity(jObject.toString());                post.setEntity(se);                HttpResponse resp = client.execute(post);                BufferedReader br = null;                if (resp.getStatusLine().getStatusCode() == HttpStatus.SC_OK){                    br = new BufferedReader(new InputStreamReader(resp                            .getEntity().getContent()));                    StringBuffer sb = new StringBuffer();                    String result = br.readLine();                    while (result != null){                        sb.append(getNumber);                        sb.append(result);                        result = br.readLine();                    }                    String s = sb.toString();                    s = s.substring(s.indexOf("{
")); JSONObject jo = new JSONObject(s); JSONObject arr = jo.getJSONObject("location"); JSONObject address = arr.getJSONObject("address"); city = address.getString("city"); } } catch (JSONException e){ e.printStackTrace(); } catch (UnsupportedEncodingException e){ e.printStackTrace(); } catch (ClientProtocolException e){ e.printStackTrace(); } catch (IOException e){ e.printStackTrace(); } finally{ post.abort(); client = null; } } return city; }

 加入这两个权限:

转载于:https://www.cnblogs.com/wuwa/archive/2013/05/28/6191664.html

你可能感兴趣的文章
C#性能优化实践
查看>>
[HTML/CSS]display:none和visibility:hidden的区别
查看>>
Xcode导入第三方库
查看>>
css required,focus,valid和invalid介绍
查看>>
C# arcengine 由FeatureClass生成TIN
查看>>
Hibernate体系结构(入门)
查看>>
ios 导航栏按钮添加与隐藏
查看>>
大数据应用分类
查看>>
linux 下查看网卡工作速率
查看>>
我的简历
查看>>
《几何与代数导引》习题1.34.3
查看>>
《几何与代数导引》例2.7.2
查看>>
结对开发Ⅱ——二维数组求和最大的子数组
查看>>
《你的灯亮着吗》读书笔记3
查看>>
Weekly 12
查看>>
【转自论坛】如何增加表空间的大小
查看>>
如何看待程序与编程语言
查看>>
Opencv笔记(八)——图像上的算数运算
查看>>
团队项目评价
查看>>
书写页面处理浏览器兼容性问题?
查看>>