博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 百度地图API 定位 导航 代码
阅读量:6514 次
发布时间:2019-06-24

本文共 6511 字,大约阅读时间需要 21 分钟。

前几天百度举办了百度世界大会,可惜没去参加,之前参加了百度的开发者大会,在会上也了解了百度的产品,百度现在朝着平台化的方向在发展,感觉很不错,也试用了百度的产品,现在就用着百度的网盘,今天看了下百度地图的开放API,然后做了个Demo,这里分享出来。如果应用主要针对国内市场的话,用百度地图还是一个比较不错的选择。另外,百度还有一个PCS(Personal cloud storage)个人云存储,我比较感兴趣,之后也会继续研究,然后做个Demo分享给大家。今天就先看看这个利用百度地图定位并实现目的地导航的Demo。首先看实现效果:

         Android百度地图API实现定位与目的地导航                        Android百度地图API实现定位与目的地导航

进入后首先会得到当前位置,在地图上显示出来,在输入框中输入目的地后,就会在地图上出现最佳线路,我这里设置的是距离最小的驾车线路,另外还有公交线路、步行线路,在代码中都有详细注释。另外,在控制台还输出了线路上每一个节点的信息以及起始位置和目的地的距离,信息显示的是在当前节点的导航信息。如下图:

       Android百度地图API实现定位与目的地导航

 

接下来就看如何实现了,首先,注册百度开发者账号,并进入百度地图API查看相关资料,然后就是为需要加入地图的应用注册APP KEY,注册完后,下载百度地图jar文件,新建工程,并导入即可,下面看实现具体代码,在代码中有详细注释:

public class NavigationDemoActivity extends MapActivity {	private String mMapKey = "注册自己的key";	private EditText destinationEditText = null;	private Button startNaviButton = null;	private MapView mapView = null;	private BMapManager mMapManager = null;	private MyLocationOverlay myLocationOverlay = null;	//onResume时注册此listener,onPause时需要Remove,注意此listener不是Android自带的,是百度API中的	private LocationListener locationListener;	private MKSearch searchModel;	GeoPoint pt;	    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.main);        destinationEditText = (EditText) this.findViewById(R.id.et_destination);        startNaviButton = (Button) this.findViewById(R.id.btn_navi);                mMapManager = new BMapManager(getApplication());        mMapManager.init(mMapKey, new MyGeneralListener());        super.initMapActivity(mMapManager);                mapView = (MapView) this.findViewById(R.id.bmapsView);        //设置启用内置的缩放控件        mapView.setBuiltInZoomControls(true);          //设置在缩放动画过程中也显示overlay,默认为不绘制//        mapView.setDrawOverlayWhenZooming(true);        //获取当前位置层        myLocationOverlay = new MyLocationOverlay(this, mapView);        //将当前位置的层添加到地图底层中        mapView.getOverlays().add(myLocationOverlay);                // 注册定位事件        locationListener = new LocationListener(){			@Override			public void onLocationChanged(Location location) {				if (location != null){					//生成GEO类型坐标并在地图上定位到该坐标标示的地点					 pt = new GeoPoint((int)(location.getLatitude()*1e6),							(int)(location.getLongitude()*1e6));//					System.out.println("---"+location.getLatitude() +":"+location.getLongitude());					mapView.getController().animateTo(pt);				}			}        };                //初始化搜索模块        searchModel = new MKSearch();        //设置路线策略为最短距离        searchModel.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST);        searchModel.init(mMapManager, new MKSearchListener() {			//获取驾车路线回调方法			@Override			public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) {				// 错误号可参考MKEvent中的定义				if (error != 0 || res == null) {					Toast.makeText(NavigationDemoActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();					return;				}				RouteOverlay routeOverlay = new RouteOverlay(NavigationDemoActivity.this, mapView);							    // 此处仅展示一个方案作为示例				MKRoute route = res.getPlan(0).getRoute(0);				int distanceM = route.getDistance();				String distanceKm = String.valueOf(distanceM / 1000) +"."+String.valueOf(distanceM % 1000);				System.out.println("距离:"+distanceKm+"公里---节点数量:"+route.getNumSteps());				for (int i = 0; i < route.getNumSteps(); i++) {					MKStep step = route.getStep(i);					System.out.println("节点信息:"+step.getContent());				}			    routeOverlay.setData(route);			    mapView.getOverlays().clear();			    mapView.getOverlays().add(routeOverlay);			    mapView.invalidate();			    mapView.getController().animateTo(res.getStart().pt);			}						//以下两种方式和上面的驾车方案实现方法一样			@Override			public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) {				//获取步行路线			}						@Override			public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {				//获取公交线路			}						@Override			public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {			}			@Override			public void onGetAddrResult(MKAddrInfo arg0, int arg1) {			}			@Override			public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {			}			@Override			public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) {			}		});                startNaviButton.setOnClickListener(new OnClickListener() {						@Override			public void onClick(View v) {				String destination = destinationEditText.getText().toString();								//设置起始地(当前位置)				MKPlanNode startNode = new MKPlanNode();				startNode.pt = pt;				//设置目的地				MKPlanNode endNode = new MKPlanNode(); 				endNode.name = destination;								//展开搜索的城市				String city = getResources().getString(R.string.beijing);//				System.out.println("----"+city+"---"+destination+"---"+pt);				searchModel.drivingSearch(city, startNode, city, endNode);				//步行路线//				searchModel.walkingSearch(city, startNode, city, endNode);				//公交路线//				searchModel.transitSearch(city, startNode, endNode);			}		});            }        @Override	protected void onResume() {		mMapManager.getLocationManager().requestLocationUpdates(locationListener);        myLocationOverlay.enableMyLocation();        myLocationOverlay.enableCompass(); // 打开指南针		mMapManager.start();		super.onResume();	}        @Override	protected void onPause() {		mMapManager.getLocationManager().removeUpdates(locationListener);		myLocationOverlay.disableMyLocation();//显示当前位置		myLocationOverlay.disableCompass(); // 关闭指南针		mMapManager.stop();		super.onPause();	}	@Override	protected boolean isRouteDisplayed() {		// TODO Auto-generated method stub		return false;	}		// 常用事件监听,用来处理通常的网络错误,授权验证错误等	class MyGeneralListener implements MKGeneralListener {			@Override			public void onGetNetworkState(int iError) {				Log.d("MyGeneralListener", "onGetNetworkState error is "+ iError);				Toast.makeText(NavigationDemoActivity.this, "您的网络出错啦!",						Toast.LENGTH_LONG).show();			}			@Override			public void onGetPermissionState(int iError) {				Log.d("MyGeneralListener", "onGetPermissionState error is "+ iError);				if (iError ==  MKEvent.ERROR_PERMISSION_DENIED) {					// 授权Key错误:					Toast.makeText(NavigationDemoActivity.this, 							"请在BMapApiDemoApp.java文件输入正确的授权Key!",							Toast.LENGTH_LONG).show();				}			}		}}
然后是布局文件:

AndroidMainifest.xml:

转载于:https://www.cnblogs.com/xiaowangba/archive/2013/03/11/6314252.html

你可能感兴趣的文章
web.xml 中的listener、 filter、servlet 加载顺序
查看>>
MyBatis原理简介和小试牛刀
查看>>
js部分基础
查看>>
Docker 常用基础命令
查看>>
脏读,幻读,不可重复读解释和例子
查看>>
Day02 数值运算&条件判断
查看>>
Tomcat指定(JDK路径)JAVA_HOME而不用环境变量
查看>>
Bluemix专属版本落地中国 开放物联网和认知计算能力
查看>>
汤姆大叔的6道javascript编程题题解
查看>>
【世界知名量子科学家加盟阿里】施尧耘出任阿里云量子技术首席科学家
查看>>
DataCore对外出售其虚拟化软件产品
查看>>
如何唤醒沉睡的医疗大数据?
查看>>
动态应用加固(DAR)技术破局登录信息泄露难题
查看>>
大数据助力 智慧环保“十三五”前景广阔
查看>>
智慧计算战略再推进 浪潮新一代服务器M5发布在即
查看>>
WiFi卡慢顿赖路由?这个锅得手机背
查看>>
说说云计算与移动管理
查看>>
T-Mobile美国使用28GHz频段测试5G
查看>>
如何缓解影子云服务安全风险?
查看>>
补天白帽大会:建企业与白帽协同机制,全方位解决网络安全隐患
查看>>