关于百度地图(二):只需要定位,不需要地图(什么?回调混乱?一招解决!)
来源:互联网 发布:数据库er图 编辑:程序博客网 时间:2024/05/21 05:39
由于项目需求,APP里进入一个模块里,只需要获取到我当前的地理位置(经纬度),而不需要进入到地图中去。辣么问题来了,在之前写的那个工具类中有用到baiduMap,需要在XML文件中添加MapView,但是我们定位是不需要这些东西的。其实这里可以去对mapView进行一个判空来解决,但是这样会使得工具类很难用,于是我把其中的一些代码抽出来,重新写了一个工具类,专门用于定位,不需要bauduMap。但是在使用的时候,发现一个问题:由于我项目中是从含地图的Activity跳转到一个只需要定位的Activity中去,由于在含地图的Acitivyt注册了监听器,在跳进不含地图但是要定位的Activity里去时,当你定位的时候,百度回调时,还是会继续回调给上一个Activity,然后MapView等都有了上一个Activity的值。而且回调的时候还会继续给上一个回调,而我们需要的这个只定位的Acitivyt反而有时候收不到回调。于是我做出了修改,
具体如下:
/** * 当前地理坐标 */ private LatLng mLoactionLatLng; public LocationClient mLocationClient; public String locationProvider="0.0,0.0" ; public String locationPos ; private Dialog fDialog, failDialog; private TextView txt_Yes, txt_No,txt_fail_Yes,txt_fail_No; private Context context; private CallBack mCallBack; public boolean isPosition=false; public String getLocationProvider() { return locationPos; } public void setCallBack(CallBack mCallBack) { this.mCallBack = mCallBack; } public MapPositionUtil(Context context){ this.context=context; } // 地图 public void initSettingMapViews() { if (isPosition==false){ isPosition=true; } // 定位初始化 if (mLocationClient==null){ mLocationClient=new LocationClient(context); } // 定位到我的位置 LocationClientOption option = new LocationClientOption(); option.setOpenGps(true);// 打开gps option.setCoorType(CoordinateType.BD09LL); // 设置坐标类型 option.setScanSpan(900); // 设置只定位一次 mLocationClient.setLocOption(option); mLocationClient.start(); // 开启定位 } // 定位监听器 private class MyBDLocationListner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { // 定位当前的地点 double mLantitude = location.getLatitude(); double mLongtitude = location.getLongitude(); locationProvider = mLongtitude + "," + mLantitude; mLoactionLatLng = new LatLng(mLongtitude, mLantitude); // 判断是否获取成功 if (isLnglat(locationProvider)) { // 获取成功 Toast.makeText(context,"定位成功", Toast.LENGTH_SHORT).show(); if (mCallBack!=null) { //定到的位置局中心 LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate uu = MapStatusUpdateFactory.newLatLngZoom(ll,14.0f);//1公里 mCallBack.getGPS(locationProvider); } } else if (locationProvider.equals("0.0,0.0") || !isLnglat(locationProvider)) { // 获取失败 failDialog(); // 获取失败弹框获取提示是否重新定位 } } } // 判断是否是经纬度正则表达式 public boolean isLnglat(String ss) { String reg = "^[0-9]{3}\\.[0-9]+\\,[0-9]{2}\\.[0-9]+$"; return ss.matches(reg); } // 地理位置信息获取成功弹出Dialog public void promptDialog() { fDialog=new Dialog(context); fDialog.setTitle("系统信息"); fDialog.setCancelable(false); View myv = LayoutInflater.from(context).inflate(R.layout.item_map_position_prompt_dialog , null); fDialog.setContentView(myv); txt_Yes = (TextView) myv.findViewById(R.id.txt_Yes); txt_No = (TextView) myv.findViewById(R.id.txt_No); txt_Yes.setOnClickListener(new DialogClick()); txt_No.setOnClickListener(new DialogClick()); fDialog.show(); // 暂放 } // 地理位置信息获取失败弹出Dialog public void failDialog() { failDialog=new Dialog(context); failDialog.setTitle("系统信息"); failDialog.setCancelable(false); View myv = LayoutInflater.from(context).inflate( R.layout.item_failure_main_prompt_dialog, null); failDialog.setContentView(myv); txt_fail_Yes = (TextView) myv.findViewById(R.id.txt_fail_Yes); txt_fail_No = (TextView) myv.findViewById(R.id.txt_fail_No); txt_fail_Yes.setOnClickListener(new DialogClick()); txt_fail_No.setOnClickListener(new DialogClick()); failDialog.show(); // 暂放 } // 弹窗的点击事件 class DialogClick implements View.OnClickListener { @Override public void onClick(View arg0) { // TODO Auto-generated method stub switch (arg0.getId()) { case R.id.txt_fail_Yes: new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { failDialog.dismiss(); initSettingMapViews(); // 重新取定位 } }); break; case R.id.txt_fail_No: failDialog.dismiss(); break; default: break; } } } //获取到定位的回调 public interface CallBack{ void getGPS(String gps); }
这里可以看到,这里与上一篇中有MapView的那个工具类其实是差不多的,只是把对MapView与baiduMap的相关代码删除了。但是!!!我们上面没有了mLocationClient绑定的监听器的方法,因为我增加了这两个方法:registerLocationListener()和unregisterLocationListener():
MyBDLocationListner myBDLocationListner=new MyBDLocationListner();/** * 注册监听,定位到我的位置 */ public void registerLocationListener(){ if (mLocationClient==null){ mLocationClient=new LocationClient(context); } mLocationClient.registerLocationListener(myBDLocationListner); } /** * 取消监听 */ public void unregisterLocationListener(){ mLocationClient.unRegisterLocationListener(myBDLocationListner); }
我把注册监听的单拎出来写了两个方法,他们在Activity的onPause()和onResume()方法中调用:
@Override public void onPause() { super.onPause(); mapPositionUtil.unregisterLocationListener();//取消监听 } @Override protected void onResume() { super.onResume(); mapPositionUtil.registerLocationListener();//注册监听 }
上面这两行代码非常关键,要取消注册,然后再给我们新跳入的Activity进行注册。这样就不会继续给上一个Activity回调了,也节省了资源。
那么当重新定位的时候,只需要在Activity里判定一下isPosition就可以了
if (mapPositionUtil.isPosition==true) { mapPositionUtil.mLocationClient.requestLocation();//重新定位 } else { mapPositionUtil.initSettingMapViews();//开始定位 }
以上就是关于百度地图,只需要定位,获取经纬度的方法
- 关于百度地图(二):只需要定位,不需要地图(什么?回调混乱?一招解决!)
- 百度地图只定位
- android百度地图(二)之定位
- 百度地图 baiduMap(二) 定位
- Android百度地图开发(二)-定位
- Android之百度地图(二)基础地图和定位
- js 百度地图标记定位(一)
- 百度地图学习(一):定位
- 百度地图开发(一)——地图定位
- Android百度地图开发(二)定位之手动定位
- iOS关于地图定位基础(二)
- iOS关于地图定位基础(一)
- 百度地图(一)
- 百度地图(一)
- 百度地图(一)
- android学习难点解决之(一)百度地图的定位---getLastKnownLocation为空和MapActivity
- 地图与定位(二)系统地图
- 解决百度地图无法定位
- 如何使用边框设计各种样式的盒子
- 2018网易校招内推-小易喜欢的数列
- 当我们在谈论机器学习时我们到底在谈些什么
- Synchronized和Lock的区别
- Springmvc后台校验加文件上传(完整版)
- 关于百度地图(二):只需要定位,不需要地图(什么?回调混乱?一招解决!)
- 本地化设置
- 宝宝秀项目学习(五)
- PHP性能分析之侵入式分析
- 06:甲流疫情死亡率
- PHP实现搜索附近的人代码
- Android热修复技术总结
- weblogic10.3.6安装
- Java集合---ArrayList的实现原理(转载)