如题,同样是百度地图SDK开发过程中遇到的一个问题,交代下背景:
开发了一款内嵌百度地图的应用,因此里面差不多将目前百度地图SDK开放的主要功能都用到了,定位,地图显示,覆盖物标示,POI搜索,行程路线规划,GPS导航。。等等都有。开发最开始用到的SDK版本因为是整合版本,因此各个功能部分的SDK都不确保是最新的,也就没有遇到诸如论坛上的好多仁兄遇到的将分别下载的几个单独的SDK包集成到一个应用中引发的冲突的问题,毕竟之前用的整合包导航SDK还是1.1的定位SDK还是5.3的地图SDK则用的是3.5的,可能也算新的,但是相比目前的导航2.0地图6.0.5来说还是旧的。
言归正传,因为我将大部分初始化类的工作都放到了一个单独的service中,因此实际的Activity可能只是做了一部分UI的处理工作,当然也包括了地图图层的初始化工作,但是基本可以看做是Service中所做的导航初始化和地图图层的初始化都是同步进行的,当时导航SDK1.1的时候并未发现其他异常,但是到了更新到导航2.0的时候问题就来了。导航初始化如下:
// 初始化导航引擎 private void initNaviEngine(Activity activity) { // 显示加载对话框 DialogUtil.getInstance().showProgressDialog(mActivity); BaiduNaviManager.getInstance().setNativeLibraryPath(getSdcardDir() + "/BaiduNaviSDK_SO"); BaiduNaviManager.getInstance().init(mActivity, getSdcardDir(), DDApp.getInstance().getApplicationInfo().packageName, new NaviInitListener() { String authinfo = null; @Override public void onAuthResult(int status, String msg) { if (0 == status) { authinfo = "key校验成功!"; } else { authinfo = "key校验失败, " + msg; } mActivity.runOnUiThread(new Runnable() { @Override public void run() { // Toast.makeText(mActivity, authinfo, // Toast.LENGTH_LONG).show(); Log.d(TAG, authinfo); } }); } public void initSuccess() { // Toast.makeText(mActivity, "百度导航引擎初始化成功", // Toast.LENGTH_SHORT).show(); Log.d(TAG, "百度导航引擎初始化成功"); } public void initStart() { // Toast.makeText(mActivity, "百度导航引擎初始化开始", // Toast.LENGTH_SHORT).show(); Log.d(TAG, "百度导航引擎初始化开始"); } public void initFailed() { // Toast.makeText(mActivity, "百度导航引擎初始化失败", // Toast.LENGTH_SHORT).show(); Log.d(TAG, "百度导航引擎初始化失败"); } }, null /* mTTSCallback */); // BNRouteGuideManager.getInstance().setVoiceModeInNavi(BNRouteGuideManager.VoiceMode.Novice); // 显示加载对话框 DialogUtil.getInstance().dismissProgressDialog(); }地图的初始化则如下:
// 初始化地图 protected void initMapView() { if (mMapView != null) deinitMapView(); mCurrentMode = LocationMode.FOLLOWING; mMapView = new MapView(getActivity()); mBaiduMap = mMapView.getMap(); mBaiduMap.setMyLocationEnabled(true); mBaiduMap.setOnMapLoadedCallback(new OnMapLoadedCallback() { @Override public void onMapLoaded() { // TODO Auto-generated method stub bIsFinish = true; } }); fl_map.addView(mMapView); fl_map.setVisibility(View.VISIBLE); // 隐藏百度logo View child = mMapView.getChildAt(1); if (child != null && child instanceof ImageView) { child.setVisibility(View.INVISIBLE); } hideZoomView(mMapView); }看似两者并不冲突,但是实际中却发现了很诡异的问题,就是看起来地图图层在刷新时出现了问题,只显示了一片白色,只所以强调是白色是因为如果是灰色网格的话很可能就是key验证未通过或者无网络了,所以当时以为是地图图层刷新出现了问题,直到最后可能意识到是导航初始化的时间点选的有误引起的问题,才找到了问题点,就是因为导航引擎初始化和地图图层的加载发生了冲突才导致了地图图层加载失败,于是后来的问题也就好解决了,我的做法是在发起导航之前再做引擎的初始化,而且这个初始化只需要做一次,时间也不会很长所以完全可以忽略这种延迟。
因此当出现地图图层加载异常无法正常显示无法拖动的时候,可以考虑下我所遇到的情况。
最后再说下我的SDK环境,导航SDK 2.0 地图SDK 3.5.0 定位SDK 6.0.5 。供各位参考