关于百度地图的整理

来源:互联网 发布:淘宝如何卖高仿耐克鞋 编辑:程序博客网 时间:2024/05/20 03:37

最近做的都是关于百度地图的事,整理一下这阶段的东西,便于以后调用。
1.申请百度地图key与下载sdk
1.1申请key的时候要求SHA1值,由于现在基本使用android studio,获取SHA1值的方式不像Eclipse那样方便,这里踩过一些坑。
没关系,我们参考一下前人的博客:
参考博客1:http://blog.csdn.net/qq_29269233/article/details/53725865
参考博客2:http://blog.csdn.net/csdnhejingzhou/article/details/50643246
参考博客3:http://blog.csdn.net/xinpengfei521/article/details/52966428
有了以上3篇博客,基本都能解决这个问题
其实整理一下思路,就是这个文件本来是没有的,需要先去创建一个这样的文件,然后再去执行
所有先进去.android(在C盘,自己用户目录下)
再输入: keytool -list -v -keystore debug.keystore就可以了
2.开始敲代码了
2.1我是创建了一个MapUtil的工具类,在构造方法中传入了一个Context

public class BaiduMapUtil{public BaiduMapUtil(Context context){    this.context=context;}}

然后就开始写定位

 public MapView mMapView; public BaiduMap mBaiduMap; private LocationClient mLocationClient; private Context context;  /**   * 当前地理坐标   */public LatLng mLoactionLatLng;

写一个定位的方法

public void initSettingMapViews(final Context context) {        mBaiduMap=mMapView.getMap();        //普通地图        mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);        Toast.makeText(context,"正在获取位置请稍后...",Toast.LENGTH_SHORT).show();        // 初始化地图        mMapView.showZoomControls(true);//缩放组件        mMapView.removeViewAt(1);//隐藏logo        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);        DisplayMetrics dm = new DisplayMetrics();        wm.getDefaultDisplay().getMetrics(dm);        int width = dm.widthPixels;        int height = dm.heightPixels;        mBaiduMap.setCompassPosition(new android.graphics.Point(width-100,100));//指南针位置        // 开启定位图层        mBaiduMap.setMyLocationEnabled(true);        // 定位初始化        mLocationClient = new LocationClient(context);        // 定位到我的位置        mLocationClient.registerLocationListener(new MyBDLocationListner());        LocationClientOption option = new LocationClientOption();        option.setOpenGps(true);// 打开gps        option.setCoorType(CoordinateType.BD09LL); // 设置坐标类型        option.setScanSpan(900);        mLocationClient.setLocOption(option);        mLocationClient.start(); // 开启定位        // 初始化当前地理坐标        mLoactionLatLng = mBaiduMap.getMapStatus().target;    }

加上上面用到的定位监听器

 // 定位监听器    public class MyBDLocationListner implements BDLocationListener {        @Override        public void onReceiveLocation(BDLocation location) {            // mapview 销毁后不在处理新接收的位置            if (location == null || mMapView == null) {                return;            }            MyLocationData data = new MyLocationData.Builder().accuracy(0)//                    .direction(location.getDirection())//                    .latitude(location.getLatitude())//                    .longitude(location.getLongitude())//                    .build();            mBaiduMap.setMyLocationData(data);            // 定位当前的地点            double mLantitude = location.getLatitude();            double mLongtitude = location.getLongitude();            locationProvider = mLongtitude + "," + mLantitude;            mLoactionLatLng = new LatLng(mLantitude,mLongtitude);            //定到的位置局中心            LatLng ll = new LatLng(location.getLatitude(),                    location.getLongitude());            MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(ll,15.0f);//500米            // 判断是否获取成功            if (isLnglat(locationProvider)) { // 获取成功                if (isFristLocation){                    isFristLocation = false;                    mBaiduMap.animateMapStatus(u);                }                if (mCallBack!=null) {                    mBaiduMap.animateMapStatus(u);                    mCallBack.getGPS(locationProvider);                }                Toast.makeText(context,"定位成功",Toast.LENGTH_SHORT).show();            } else if (locationProvider.equals("0.0,0.0")                    || !isLnglat(locationProvider)) { // 获取失败                failDialog(); // 获取失败弹框获取提示是否重新定位            }        }        @Override        public void onConnectHotSpotMessage(String s, int i) {        }    }

由于是耗时操作,所以我上面用了一个回调

private CallBack mCallBack;public void setCallBack(CallBack mCallBack) {        this.mCallBack = mCallBack;    }public interface CallBack{      void getGPS(String gps);    }

然后我们再Activity里调用的获取到的坐标的时候

 BaiduMapUtil.CallBack mCallBack = new BaiduMapUtil.CallBack() {        @Override        public void getGPS(String gps) {            locationProvider = gps;        }

当位置获取失败的时候,我们弹出一个dialog,可以选择重新获取,或者不获取

// 地理位置信息获取失败弹出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(); // 暂放    }// dialog的点击事件    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(context); // 重新取定位                        }                    });                    break;                case R.id.txt_fail_No:                    mLocationClient.stop();// 关闭定位器                    failDialog.dismiss();                    break;                default:                    break;            }        }    }

在用地图时,我们可能把地图的视角移动到其他地方去了,那这个时候,我们怎么回到自己当前的点呢?
当然是重新定位一下:

 public void reLocate(Context context){        Toast.makeText(context,"重新定位...",Toast.LENGTH_SHORT).show();        mBaiduMap.setMyLocationEnabled(true);        // 定位初始化        mLocationClient = new LocationClient(context);        // 定位到我的位置        mLocationClient.registerLocationListener(new MyBDLocationListner());        LocationClientOption option = new LocationClientOption();        option.setOpenGps(true);// 打开gps        option.setCoorType(CoordinateType.BD09LL); // 设置坐标类型        option.setScanSpan(900);        mLocationClient.setLocOption(option);        mLocationClient.start(); // 开启定位        // 初始化当前地理坐标        mLoactionLatLng = mBaiduMap.getMapStatus().target;    }

然后在Activity里,对百度地图金星生命周期的管理

 @Override    protected void onStop() {        super.onStop();        mapUtil.mBaiduMap.setMyLocationEnabled(false);    }    @Override    protected void onDestroy() {        super.onDestroy();        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理        mapUtil.mMapView.onDestroy();        mapUtil.mBaiduMap.setMyLocationEnabled(false);        mapUtil.poiSearch.destroy();    }    @Override    protected void onResume() {        super.onResume();        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理        mapUtil.mMapView.onResume();    }    @Override    public void onPause() {        super.onPause();        mapUtil.mMapView.onPause();    }    @Override    protected void onStart() {        super.onStart();        // 开启图层定位        mapUtil.mBaiduMap.setMyLocationEnabled(true);    }

最后别忘了,判断地理位置是否是经纬度的正则表达式:

// 判断是否是经纬度正则表达式    public boolean isLnglat(String ss) {//纬度,经度        String reg = "[0-9]{2}\\.[0-9]+$,^[0-9]{3}\\.[0-9]+\\";        return ss.matches(reg);    }
原创粉丝点击