首页 > 技术文章 > Android百度地图SDK 导航初始化和地图初始化引起的冲突

yangykaifa 2017-06-27 14:22 原文

       如题。相同是百度地图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 。供各位參考

            

推荐阅读