您的位置:首页 > 移动开发 > Android开发

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

2016-12-10 00:08 537 查看

                    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);

//----------------
}


         
                 仔细阅读代码,收获更多!
            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: