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