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); //---------------- }
仔细阅读代码,收获更多!
相关文章推荐
- Android应用集成百度定位及导航
- android Gps 定位 百度地图集成方法详解-----编码
- android开发游记:集成百度定位SDK进行实时定位 获取当前城市地理信息
- Android 客服端集成高德定位功能(Android studio图文详解)
- android 百度API定位以及获取天气
- 百度地图集成(二):百度定位以及反编译地理位置
- 同时集成百度地图、定位以及导航遇到的一些坑
- Android百度地图SDK 导航SDK2.0结合定位SDK6.0.5的导航参数设置方法
- Xamarin Android 集成百度定位SDK
- android 百度导航引擎初始化失败找不到libgnustl_shared.so以及百度鹰眼轨迹异常的问题
- android集成百度定位
- Android百度定位导航之基于百度地图移动获取位置和自动定位
- [置顶] 详解在Android中集成高德定位功能
- Android调用百度地图Web端接口,实现百度定位、导航
- Android studio中集成百度地图+百度定位+导航SDK冲突导致部分手机出现“百度导航引擎初始化失败”解决方案
- Android调用百度地图app , 实现百度定位、导航
- android集成百度地图定位、poi检索、marker标记功能,以及marker点击事件
- Android调用百度地图Web端接口,实现百度定位、导航
- android百度定位导航
- Android ActionBar详解(二):ActionBar实现Tabs标签以及下拉导航 .