最近这几天在做百度地图相关的内容,被百度离线地图搞死了,按照他们官网的做法,完全不行,地图根本就无法加载,也按照了一些博客的做法,但是都和官
网的做法差不多,没办法在自己的应用中使用百度的离线地图,今天同事一语惊醒梦中人,他随口说了一句:可能是你什么包没导入进来吧,随后我仔细一步步
试验终于发现了其中的问题和关系,写篇博客记录一下。
首先我们先来看下怎样使用离线地图,上代码:
//******************************************** //离线地图监听加载以及初始化 //******************************************** public class OfflineMap{ private MKOfflineMapListener offlineMapListener; private MKOfflineMap offlineMap; private MapController mMapController; public OfflineMap(MapController mMapController){ this.mMapController = mMapController; } public void initOfflineMap(){ offlineMap = new MKOfflineMap(); offlineMapListener = new MKOfflineMapListener(){ @Override public void onGetOfflineMapState(int type, int state) { switch (type) { case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: { MKOLUpdateElement update = offlineMap.getUpdateInfo(state); } break; case MKOfflineMap.TYPE_NEW_OFFLINE: Log.d("OfflineDemo", String.format("add offlinemap num:%d", state)); break; case MKOfflineMap.TYPE_VER_UPDATE: Log.d("OfflineDemo", String.format("new offlinemap ver")); break; } } }; offlineMap.init(mMapController, offlineMapListener); int num= offlineMap.scan(); if(num!=0){ Log.i("LocationMap","成功导入离线包"+num); } } }
写好了百度离线地图类的加载程序后,就进行调用。但是我们使用时会发现offlineMap.scan() 这个方法很奇妙,我们明明导入进去了离线地图包,竟然识别不出,
问题出现在哪里呢?容我后面慢慢道来。接下来就是初始化这个类了
mMapController = mMapView.getController(); OfflineMap offlineMap = new OfflineMap(mMapController); offlineMap.initOfflineMap(); GeoPoint point = new GeoPoint((int)(getInitlat()*1e6), (int)(getInitlon()* 1e6)); mMapController.setCenter(point); mMapController.animateTo(point);
在地图刚开始加载还未定到位的时候,我们可以设置初始位置,方法如上,以上代码就能够使用百度的离线地图了。接下来就是导入离线地图包了,就是在这个地
方弄住我了。根本原因就是其实我没按照官网的步骤来走的,而是走了捷径,所以反而绕了远道,后悔莫及啊!
在导入离线地图包之前我们先明白两点:
1.百度自己的应用—百度地图和我们自己的应用使用的百度离线地图是不在同一个包下面的
2.百度地图使用的离线地图包是BaiduMap文件夹下的离线地图包,而我们的应用使用的是BaiduMapSDK文件夹下的离线地图包
如果按照官网的步骤来走我们是可以成功的,但是由于人懒有时候我们就直接复制了BaiduMap文件中的离线地图包了,结果就导致了离线地图包无法加载
的悲剧。百度官网的步骤是,先下载离线地图包,然后解压,然后将解压后的BaiduMap文件夹复制到SD卡的根目录,如果存在相同的就直接替换掉。这样做是
没有问题的,但是我们细心一点就会发现 解压后BaiduMap->vmp->h 文件夹中文件的后缀名为 .dat_svc,放入SD后,打开百度地图导入后,.dat_svc 文件则变
成了.dat的后缀了,问题就在这个地方:我们偷懒复制的是.dat文件而不是.dat_svc文件,如果一个文件被导入后那么他的后缀名则会变成.dat,我们直接复制后,
调用scan()方法是不会扫描到的,但是却用能够检使用其他方法检测到这个离线地图包。细心点我们还会发现,在h文件夹下面还有一种文件-》DVUserdat.cfg
这个文件是用户信息配置文件,当我们调用scan()方法后,不但.dat_svc 会变成.dat文件,在这个文件中还会多一条该城市的配置信息。经过试验和以上的叙述
不难总结出以下几点:
一:.dat_svc文件是百度地图作为新导入的离线地图包的标志,如果经过导入了就会变成后缀为.dat的文件
二:scan()方法的作用:1.扫描.dat_svc文件 将其变成.dat文件,2.在DVUserdat.cfg文件中记录一条该离线地图包的配置信息
三:如果我们在百度地图中直接下载离线地图包,他也会在BaiduMapSDK中有一份的。
四:我们删除掉BaiduMap文件中的DVUserdat.cfg后再次打开百度地图他会重新生成一份,但是如果我们删除掉BaiduMapSDK中的DVUserdat.cfg时我们的应用是无法使
用离地图包的。
五:我们的应用是根据BaiduMapSDK文件夹中DVUserdat.cfg文件中的配置信息来使用离线地图包的,如果离线地图包没有在这个文件中进行注册的话,那是无法加载的。
所以使用百度离线地图包时分两种情况:
一:直接复制BaiduMap文件夹下的离线地图包:那么请按照下面的步骤来:
复制完.dat后缀名的离线地图包,同时也将DVUserdat.cfg文件复制到BaiduMapSDK文件夹下
二:从官网下载离线地图包:
先解压,不是放在BaiduMap文件夹下,而是放在BaiduMapSDK文件夹下,必须调用Scan()方法。
通过以上的叙述就能够顺利实现我们自己的应用也能够使用百度离线地图包了。