关于百度地图(二):只需要定位,不需要地图(什么?回调混乱?一招解决!)

来源:互联网 发布:数据库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();//开始定位          }

以上就是关于百度地图,只需要定位,获取经纬度的方法