最新Android百度地图3.4.x的使用

最近碰到一个跟地图有关系的业务,很早之前到是用过百度地图还是1.x 今天去用发现已经不能使用了,查看百度API发现已经都改了,到网上去查新版的地图使用结果

发现全部都是以前的版本,看来想偷懒是不可能,只能自己去看文档来写了。

官方的文档:http://developer.baidu.com/map/index.php 根据需要去下载对应的SDK(我这里只用地图和定位)

根据官方的开发步骤,在自己的工程里 导入需要的jar文件和so文件即可。

同时需要申请key,具体过程请看官方指导很详细,这里就不再啰嗦。

今天要完成的功能是定位和实现在地图上的线路规划(步行)

1 定位:

布局文件如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
	<LinearLayout
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content">
	    <Button
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="步行线路"
	        android:onClick="start_line"
	        />
	    <Button
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="定位"
	        android:onClick="start_location"
	        />
	    <TextView
	        android:id="@+id/tv"
	        android:layout_width="match_parent"
	        android:layout_height="wrap_content"
	        android:padding="@dimen/padding_medium"
	        android:text="@string/hello_world"
	        />
	</LinearLayout>
        <!-- 引入百度地图组件 参考官方例子-->	
       <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" />
	
</LinearLayout>


根据需要就直接在界面上加入了百度的地图组件 MapView .

先说明下我们会使用到的几个东西:

 private MapView baidum = null ;//地图显示组件
 private BaiduMap mBaiduMap = null ;//百度地图对象
 private LocationClient locationc = null ;//定位客户端
 private boolean isFirstLoc = true ;//是否是第一次定位
 private RoutePlanSearch mSearch =null ; //poi搜索(步行规划需要)
 //还需要对应的定位监听和步行规划监听 2个对象,在后面给出
 private BDLocationListener location_listener = null;//定位监听

下面给出代码:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        //
        baidum = (MapView)findViewById(R.id.bmapView);
        mBaiduMap = baidum.getMap();//获取地图对象
		// 开启定位图层
		mBaiduMap.setMyLocationEnabled(true);
        locationc = new LocationClient(this);
        location_listener = new MyLocationListener();//定位监听实现类
        locationc.registerLocationListener(location_listener);//注册监听
    }

默认一开始地图会显示京城为默认显示地图,所以这里我用一个按钮来切换到当前自己的 位置:

public void start_location(View v){
    	//按钮事件
    	LocationClientOption option = //定位参数设置,参考官方
    		new LocationClientOption();
		option.setOpenGps(true);// 打开gps
		option.setCoorType("bd09ll"); // 设置坐标类型
		option.setScanSpan(5*60*1000);//定位的频率(ms)
		locationc.setLocOption(option);
		locationc.start();//开始定位,定位成功会回调监听
    }

监听对象的实现,需要实现定位监听接口:

class MyLocationListener implements BDLocationListener{
		@Override
		public void onReceiveLocation(BDLocation location) {
			if (location == null || baidum == null){
				return;
			}
			MyLocationData locData = new MyLocationData.Builder()
					.accuracy(location.getRadius())
					// 此处设置开发者获取到的方向信息,顺时针0-360
					.direction(0).latitude(location.getLatitude())
					.longitude(location.getLongitude()).build();
			mBaiduMap.setMyLocationData(locData);
			if (isFirstLoc) {
				isFirstLoc = false;
				LatLng ll = new LatLng(location.getLatitude(),
						location.getLongitude());
				//设置定位显示模式为:跟随(会有个箭头)、普通、指南针三种
				mBaiduMap.setMyLocationConfigeration(
						new MyLocationConfiguration(LocationMode.FOLLOWING,true,null));
				MapStatusUpdate u1 = MapStatusUpdateFactory.zoomTo(17);//定位目标时放到到17倍
				mBaiduMap.setMapStatus(u1);
				//
				MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);//定位到的坐标
				mBaiduMap.animateMapStatus(u);//动画显示到目标位置,也就是自己的手机所在地
			}
			TextView tv = (TextView)findViewById(R.id.tv);
			tv.setText("经纬度:"+location.getLongitude() + " : " + location.getLatitude());
		}
    	
    }

部署到手机,运行,打开GPS和网络 基本就可以实现了(注意,需要在清单里加入所必须的内容和所需的权限在后面给出,如果是空白网格 key错误的可能性比较大)

下面给出步行规划的实现(按钮完成):

 

public void start_line(View v){
    	//参考官方包: com.baidu.mapapi.search.route
    	mSearch = RoutePlanSearch.newInstance();//实例化 路径规划搜索接口 
		mSearch.setOnGetRoutePlanResultListener(rlistener);//规划监听
    	WalkingRoutePlanOption option = new WalkingRoutePlanOption() ;//步行规划对象
    	PlanNode start = PlanNode.withCityNameAndPlaceName("长沙", "林科大");  //起点
    	PlanNode end = PlanNode.withCityNameAndPlaceName("长沙", "五一广场");//终点
    	option.from(start);  
    	option.to(end);
    	if(mSearch.walkingSearch(option)){
    		Toast.makeText(getApplicationContext(), "步行线路完成", Toast.LENGTH_SHORT).show();
    	}
    }

路径搜索监听:


OnGetRoutePlanResultListener rlistener = new OnGetRoutePlanResultListener() {
		@Override
		public void onGetWalkingRouteResult(WalkingRouteResult result) {
			//步行规划结果
			 List<WalkingRouteLine> all_lines = result.getRouteLines();
			 if(all_lines!=null){
				 for(WalkingRouteLine line : all_lines){
					 //步行规划覆盖层:
					 WalkingRouteOverlay wo = new WalkingRouteOverlay(mBaiduMap);
					 wo.setData(line);
					 wo.addToMap();//添加到地图
					 wo.zoomToSpan();//缩放到合适大小显示整个线路
				 }
			 }
		}
		@Override
		public void onGetTransitRouteResult(TransitRouteResult arg0) {
			//公交
		}
		@Override
		public void onGetDrivingRouteResult(DrivingRouteResult arg0) {
			//驾车
		}
	};


到此已经能完整的显示结果了。

附权限(都可以从官网上提示获取):

<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.ACCESS_GPS" />    
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />


需要在清单里写的内容(详情参考官方说明)

在<application>里写入:

<meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="你自己程序的key" />

还有这个:

<service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" />


Ok。去试试吧!小东西,大神无视吧……

源码下载,打了那么多字支持下吧




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值