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

由于项目需求,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();//开始定位
          }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值