Android集成百度定位以及导航详解

来源:互联网 发布:淘宝买家退款率计算 编辑:程序博客网 时间:2024/05/22 00:27

                    Android集成百度定位以及导航详解

         
         百度地图Android SDK 官方下载地址:

                           包括类参考、示例代码、开发包(基础地图、检索功能、LBS云检索和计算工具)

                      申请密钥教程:点击打开


1.无GUI定位:
       
  步骤0:清单中 添加需要的权限、Application中添加 百度定位服务以及 需要配置的 key   添加lib文件
                     
                        下载demo后将demo清单文件中权限 、 lib下的文件  拷贝即可 
              
            <service            android:name="com.baidu.location.f"            android:enabled="true"            android:process=":remote" />
             
             此服务为百度定位的定位服务,定位都要靠这个服务,必须得加。
             
            
            <meta-data            android:name="com.baidu.lbsapi.API_KEY"            android:value="申请的密钥" />
              
            这一步也不可缺少。
            
             ↓看下一步
                     
    步骤1:初始化SDK

                    初始化SDK 一般放在应用的Application的子类中。也可以放在单独的Activity或Fragment中,不过换了            页面要重新初始化SDK(建议放在Application
               
           Location.initLocation(getBaseContext());
          就一行代码初始化了SDK。
            
           ↓看下一步
 
    步骤2:实例化定位类
     步骤3:设置定位参数
    步骤4:设置定位回调(成功后回调接口)
    步骤5:开启定位以及关闭定位(时机)
             ( 以上4个步骤一般都是封装在一个方法里,除了定位回调)
                LocationClient就是定位需要的类   初始化:        
         
          LocationClient mLocationClient = new LocationClient(上下文);
                
                 LocationClientOption  是定位参数需要的类,一般设置都有如下:
             
            LocationClientOption option = new LocationClientOption();            //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备            option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);            //可选,默认gcj02,设置返回的定位结果坐标系            option.setCoorType("bd09ll");            int span = 0;            //可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才有效的            option.setScanSpan(span);            option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要            option.setOpenGps(true);//可选,默认false,设置是否使用gps            option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果            option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.            getLocationDescribe里得到,结果类似于“在北京天安门附近”            option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiLi            st里得到            option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是            否在stop的时候杀死这个进程,默认不杀死            option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集            option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要            option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//设置高精度定位定位模式            mLocationClient.setLocOption(option);
 
              ( 一般设置只需要设置一次就可以了,必要时可以用if判断来让设置有且执行一次,除了需要动态修改参数)

        
      mLocationClient.registerLocationListener(new BDLocationListener() {            @Override            public void onReceiveLocation(BDLocation bdLocation) {               //事情做完了关闭定位
             mLocationClient.stop();
} }); mLocationClient.start();
          定位需要的类设置监听事件 回调成功定位后各种参数 封装在BDLocation中,可以通过BDLocation对象获          取地理各种参数 比如经纬度 当前地址 当前城市 国家 国家号码等等,具体参考文档。
         
          这样无GUI的定位就结束了。

2.GUI定位和导航
     步骤0:参考无GUI定位的步骤0.
            步骤1:初始化SDK

               Location.initLocation(getBaseContext());    ←无GUI的定位SDK
               SDKInitializer.initialize(getApplicationContext());  ←GUI的定位SDK(设计到控件以及各组建交互需要)
             步骤2:显示地图控件,开启定位图层以及导航(GUI定位涉及很多内容介绍GUI定位以及添加覆盖物绘制路                                                                                            线)         
                    1. 初始化地图控件:(MapView为地图控件)
              
           mMapView = (MapView) findViewById(R.id.map);            mBaiduMap = mMapView.getMap();         // 开启定位图层           mBaiduMap.setMyLocationEnabled(true);
              {
                       这边有一点要强调,因为百度地图是一直绘制,占用挺多内存,所以在生命周期里管理控件
             
  @Override    protected void onPause() {        super.onPause();        // activity 暂停时同时暂停地图控件        mMapView.onPause();    }    @Override    protected void onResume() {        super.onResume();        // activity 恢复时同时恢复地图控件        mMapView.onResume();    }    @Override    protected void onDestroy() {        super.onDestroy();        // activity 销毁时同时销毁地图控件        mMapView.onDestroy();        if (mSearch != null) {            mSearch.destroy();        }    }

                }
 
                    2.通过无GUI的定位方式在回调接口里获取经纬度
                     
                     
 mLocationClient.registerLocationListener(new BDLocationListener() {            @Override            public void onReceiveLocation(BDLocation bdLocation) {             latitude = location.getLatitude();  // 获取精度纬度              longitude = location.getLongitude();            LatLng ll = new LatLng(latitude, longitude);              MapStatus.Builder builder = new MapStatus.Builder();             builder.target(ll).zoom(18.0f);              mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));//地图移动到当前经纬                  度             、  //事情做完了关闭定位             mLocationClient.stop();            }        });        mLocationClient.start();

              最后baiduMap 调用animateMapStatus 进行移动到设置的经纬度位置
           
             3.添加覆盖物以及设置两个经纬度之间的连线,根据地址编码经纬度:
               
                 一般搜索两个位置   通过当前位置即回调中的经纬度,另一方通过输入地址来获取经纬度,最后通过两个                 经纬度来处理一些操作,并对两个经纬标记(添加覆盖物()添加标记)!
             
               
//通过地址获取经纬度public  void  checkAddPosition( )    {        if(mSearch==null)        {            mSearch = GeoCoder.newInstance();            mSearch.setOnGetGeoCodeResultListener(listener);        }        mSearch.geocode(new GeoCodeOption()                .city("XX")                .address("xx村"));    }
   
       上述代码介绍使用 private GeoCoder mSearch;  的对象来反编码。最后会通过一个回调函数来接收经纬度
           
//计算地理的 编码与反编码    OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {        public void onGetGeoCodeResult(GeoCodeResult result) {            if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {                //没有检索到结果                PromptManager.showToast(BDNavigationActivity.this,"当前城市无法进行定位!");            }            else {                //获取地理编码结果                LatLng location = result.getLocation();                double latitude1 = location.latitude;                double longitude1 = location.longitude;                getLine(latitude, longitude, latitude1, longitude1);                Log.i("TAG", "latitude1:" + latitude1 + "  longitude1" + longitude1);            }        }        @Override        public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {            if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {                //没有找到检索结果            }            //获取反向地理编码结果        }    };

         上获取了两个经纬度后 就可以对两个电进行操作比如果 对两个电添加覆盖物以及连线,博主封装了一个方法来设置两个经纬度之间的联系以及添加覆盖物。覆盖物可以换图片以及其他控件

        
public void  getLine(double latitude,double longitude,double latitude1,double longitude1)    {        //------------添加覆盖物--d--------        BitmapDescriptor bdA = BitmapDescriptorFactory                .fromResource(R.drawable.icon_marka);        BitmapDescriptor bdB = BitmapDescriptorFactory                .fromResource(R.drawable.icon_markb);        LatLng llA = new LatLng(latitude, longitude);        LatLng llB = new LatLng(latitude1, longitude1);        MarkerOptions ooA = new MarkerOptions().position(llA).icon(bdA)                .zIndex(9).draggable(true);        Marker mMarkerA = (Marker) (mBaiduMap.addOverlay(ooA));        MarkerOptions ooB = new MarkerOptions().position(llB).icon(bdB)                .zIndex(5);        Marker mMarkerB = (Marker) (mBaiduMap.addOverlay(ooB));        //--------------------处理连线------------------        Log.i("TAG", "latitude="+latitude+"  longitude"+longitude);        List<LatLng> points = new ArrayList<LatLng>();        points.add(llA);        points.add(llB);        OverlayOptions ooPolyline = new PolylineOptions().width(5)                .color(0xAAFF0000).points(points);        mBaiduMap.addOverlay(ooPolyline);        //----------------    }

         
                 仔细阅读代码,收获更多!
            
1 0