android 百度地图应用

     最近用到百度地图API,在这里跟大家分享一下经验。要使用百度API和google一样先要去百度地图API网站上去申请KEY,申请地址如下:http://dev.baidu.com/wiki/static/imap/key/ ,申请完毕以后就可以是用了,但是百度API是作为第三方插件的方式加入到项目中所以,你还需要下载百度地图API的jar包,下载地址如下:http://dev.baidu.com/wiki/imap/index.php?title=Android%E5%B9%B3%E5%8F%B0/%E7%9B%B8%E5%85%B3%E4%B8%8B%E8%BD%BD

     然后打开下载包可以发现里面有一个jar包和一个.so文件,需要把这两个文件拷贝到项目根目录下面的libs文件夹下,并且还要新建一个armeabi文件夹,因为.so文件需要放在这个文件夹下面,具体步骤可以参考《百度手机地图sdk使用简要说明》,最后需要在Manifest文件中添加权限和版本支持如下:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
    <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.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!--版本支持-->
    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:resizeable="true"
        android:smallScreens="true" />

    <uses-sdk android:minSdkVersion="3" />

     到这里已经完事具备,大家可以在布局文件中加入Mapview了,代码如下:

    <com.baidu.mapapi.MapView
        android:id="@+id/mv_locate_map"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" />

     然后写一个类继承MapActivity把布局文件设置进去就可以在地图上显示了,如下:

    

    现在来讲讲百度API主要的几个类的使用,首先我们需要得到一个BMapManager对象的实例,刚刚大家看到我们的布局文件并没有加入key的地方,其实百度地图的key是在程序中添加的代码如下:

                           
                           manager = new BMapManager(context);
			manager.init(“API-KEY 放在这里”, new MKGeneralListener() {

				@Override
				public void onGetPermissionState(int error) {
					if (error == MKEvent.ERROR_PERMISSION_DENIED) {
						// 权限错误
					}
				}

				@Override
				public void onGetNetworkState(int error) {
					// 网络错误
				}
			});
			manager.start();
			locationManager = manager.getLocationManager();

得到了BMapManager对象以后我们就可以得到LocationManager对象,这个对象大家应该都很清楚,通过它可以得到当前位置信息,还可以通过它添加位置监听器。这里和google地图不同的是,当在添加位置监听器的时候并没有一起设置监听器的触发时间间隔,如果需要必须通过MKLocationManager的setNoitifyInternal(maxTime,minTime)方法添加,第一个参数的通知的最大时间间隔,第二个则是最小时间间隔。注册监听器这是调用MKLocationManager的requestLocationUpdates(listener); 方法,通过这些方法的设置我们就可以定时得到当前的位置信息了。

       然后下面应该把当前位置展示在地图上并加上标记,实现这些功能就需要MapView对象了,当然得到MapView对象很简单,大家应该都明白就不多说了。得到mapView对象以后需要设置几个常用的参数代码如下:

                  mapView.setBuiltInZoomControls(true);
	      mapView.setDrawOverlayWhenZooming(true);

第一个是在地图上面加上缩放按钮,第二个设置是在缩放的时候重绘地图标记。然后需要控制地图我们需要得到MapController对象代码如下:

                  control = this.mapView.getController();
               control.setZoom(zoomLeve);

这样就得到了地图控制器,第二个是设置地图的默认缩放等级,参数在0-18之间的整形参数。我这里是设置的最大缩放级别。然而在地图上加标记需要通过Overlay和ItemizedOverlay对象来实现,当然百度地图API提供了几个内置的对象给我们使用,这里我使用的是MyLocationOverlay对象代码如下:

                 MyLocationOverlay overlay = new MyLocationOverlay(context, mapView);
               mapView.getOverlays().add(overlay)

MyLocationOverlay 初始化的时候需要两个参数一个就是上下文对象,一个就是地图对象,这样就可以得到一个标记当前位置的图标,然后把这个图标加入到地图中就可以了。效果如上图所示。然后再位置监听器里面加上更新地图的代码就可以了,代码如下:

         @Override
         public void onLocationChanged(Location location) {
		if (location != null) {
	            GeoPoint point = new GeoPoint((int) (latitude * 1E6),
				(int) (longitude * 1E6));
		   //mv_locate_map.getOverlays().clear(); //清除所有标记
		   manager.addOverlay(overlay); //添加标记
		   manager.getControl().animateTo(point); //把地图移动到当前点上
		   mv_locate_map.invalidate(); //重绘地图		
                  }
	}

我这里之所以要清除所有标记应该前面我添加了每隔几秒钟就会更新地图标记,不然地图上的标记会越来越多,到后面对性能有影响,这个也是根据程序逻辑来的,大家可以不用每次清除也可以。百度地图API还提供了很多地图标记和查询功能,大家可以参考《百度地图API文档》里面有详细介绍。

        下面来讲讲我在使用中遇到的种种问题以及我的解决办法吧,首先说说我遇到的问题。

         其实这个问题主要是产生于我要添加多个位置监听器,而且每个监听器的做得事不同,而且每个监听器关闭的时间也不同,这是就出现一个问题,比如我现在同事添加了三个监听器,但是我只要调用removeUpdates(listener);方法就会把所有监听器移除。这个问题纠结我几天,最后我想出的办法就是在添加监听器的时候同时把监听器放到一个Map<String, LocationListener> 中给每个监听器命一个名字,然后在需要移除的时候根据这个名字把这个监听器对象从map中取出来再移除就行了。至于为什么会出现这种情况我也不明白,可能是一个BUG吧。

        还有一个还有一个需要注意的是BMapManager对象初始化完成以后必须调用manager.start();方法才能正常展示地图,不然地图不会显示,与之对应的当然有个manager.stop();方法,这个stop方法千万不能乱用,如果你没有完全脱离是用百度API的话最好别调用,不然所有地图中的监听器都会失效。

       还有一个地方也需要调用start()方法就是在onResume()方法中,代码如下:

     

         @Override
	protected void onResume() {
		if (manager != null) {
		   manager.onStartMap();
		}  super.onResume();
	}

    如果大家觉得我哪里说得不对的请指教,多多交流···呵呵



发布了34 篇原创文章 · 获赞 47 · 访问量 20万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章