在學習百度地圖api 導航篇時 不論怎麼仿寫官方DEMO 都不能初始化導航引擎 糾結了兩天
在LBS論壇上找到同樣問題 傳送門初始化導航失敗
文中解決方法 主要有三種:
目前demo中初始化導航失敗有三種情況:
1. 調用BaiduNaviManager.initEngine接口時activity為空;
2.系統裝載so庫(loadLibrary)時失敗,請確定BaiduNaviSDKDemo\libs\armeabi\libapp_BaiduNaviApplib_v1_0_0.so檔案存在,并且不要改名;
3.其他原因導緻native層引擎初始化失敗。這種失敗會回調NaviEngineInitListener.engineInitFail()接口,請在調用initEngine指定NaviEngineInitListener參數時在接口engineInitFail中列印一下,看看是否屬于這種情況。
我的解決方案是将demo的assets檔案夾下的BaiduNaviSDK_Resource_v1_0_0png,channel檔案拷貝到自己的工程!屬于第三種情況吧。
assets檔案夾在打包會原封不動的打包進去
官方沒有說明這個是導航功能必要的檔案,導緻初始化失敗。
部分主要Activity代碼如下:
package com.ht.activity;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMarkerDragListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.navisdk.adapter.BNOuterTTSPlayerCallback;
import com.baidu.navisdk.adapter.BNRoutePlanNode;
import com.baidu.navisdk.adapter.BaiduNaviManager;
import com.baidu.navisdk.adapter.BNRoutePlanNode.CoordinateType;
import com.baidu.navisdk.adapter.BaiduNaviManager.NaviInitListener;
import com.baidu.navisdk.adapter.BaiduNaviManager.RoutePlanListener;
import com.example.hello.R;
public class MapActivity extends Activity {
MapView mMapView = null;
BaiduMap mBaiduMap = null;
Marker marker = null;
private Button mWgsNaviBtn = null;
private MyLocationData locData;
// 導航相關
public static final String TAG = "NaviSDkDemo";
private static final String APP_FOLDER_NAME = "BNSDKDemo";
public static final String ROUTE_PLAN_NODE = "routePlanNode";
private String mSDCardPath = null;
String authinfo = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
// 在使用SDK各元件之前初始化context資訊,傳入ApplicationContext
// 注意該方法要再setContentView方法之前實作
setContentView(R.layout.map);
// 擷取地圖控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
// 普通地圖
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
mWgsNaviBtn = (Button)findViewById(R.id.avc);
//------導航開始---------
initListener();
if ( initDirs() ) {
initNavi();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
}
// ------------導航開始---------------
private void initListener() {
if ( mWgsNaviBtn != null ) {
mWgsNaviBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if ( BaiduNaviManager.isNaviInited() ) {
routeplanToNavi(CoordinateType.WGS84);
}
}
});
}
}
private void routeplanToNavi(CoordinateType coType) {
BNRoutePlanNode sNode = null;
BNRoutePlanNode eNode = null;
switch(coType) {
case GCJ02: {
sNode = new BNRoutePlanNode(116.30142, 40.05087,
"百度大廈", null, coType);
eNode = new BNRoutePlanNode(116.39750, 39.90882,
"北京天安門", null, coType);
break;
}
case WGS84: {
sNode = new BNRoutePlanNode(116.300821,40.050969,
"百度大廈", null, coType);
eNode = new BNRoutePlanNode(116.397491,39.908749,
"北京天安門", null, coType);
break;
}
case BD09_MC: {
sNode = new BNRoutePlanNode(12947471,4846474,
"百度大廈", null, coType);
eNode = new BNRoutePlanNode(12958160,4825947,
"北京天安門", null, coType);
break;
}
default : ;
}
if (sNode != null && eNode != null) {
List<BNRoutePlanNode> list = new ArrayList<BNRoutePlanNode>();
list.add(sNode);
list.add(eNode);
BaiduNaviManager.getInstance().launchNavigator(this, list, 1, true, new DemoRoutePlanListener(sNode));
}
}
public class DemoRoutePlanListener implements RoutePlanListener {
private BNRoutePlanNode mBNRoutePlanNode = null;
public DemoRoutePlanListener(BNRoutePlanNode node) {
mBNRoutePlanNode = node;
}
@Override
public void onJumpToNavigator() {
Intent intent = new Intent(MapActivity.this,
BNDemoGuideActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(ROUTE_PLAN_NODE,
(BNRoutePlanNode) mBNRoutePlanNode);
intent.putExtras(bundle);
startActivity(intent);
}
@Override
public void onRoutePlanFailed() {
// TODO Auto-generated method stub
}
}
private boolean initDirs() {
mSDCardPath = getSdcardDir();
if ( mSDCardPath == null ) {
return false;
}
File f = new File(mSDCardPath, APP_FOLDER_NAME);
if ( !f.exists() ) {
try {
f.mkdir();
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return true;
}
private String getSdcardDir() {
if (Environment.getExternalStorageState().equalsIgnoreCase(
Environment.MEDIA_MOUNTED)) {
return Environment.getExternalStorageDirectory().toString();
}
return null;
}
// 導航 初始化引擎
private void initNavi() {
// BaiduNaviManager.getInstance().setNativeLibraryPath(
// mSDCardPath + "/BaiduNaviSDK_SO");
BaiduNaviManager.getInstance().init(this, mSDCardPath, APP_FOLDER_NAME,
new NaviInitListener() {
@Override
public void onAuthResult(int status, String msg) {
if (0 == status) {
authinfo = "key校驗成功!";
} else {
authinfo = "key校驗失敗, " + msg;
}
MapActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MapActivity.this, authinfo,
Toast.LENGTH_LONG).show();
}
});
}
public void initSuccess() {
Toast.makeText(MapActivity.this, "百度導航引擎初始化成功",
Toast.LENGTH_SHORT).show();
}
public void initStart() {
Toast.makeText(MapActivity.this, "百度導航引擎初始化開始",
Toast.LENGTH_SHORT).show();
}
public void initFailed() {
Toast.makeText(MapActivity.this, "百度導航引擎初始化失敗",
Toast.LENGTH_SHORT).show();
}
},mTTSCallback);
}
private BNOuterTTSPlayerCallback mTTSCallback = new BNOuterTTSPlayerCallback() {
@Override
public void stopTTS() {
// TODO Auto-generated method stub
}
@Override
public void resumeTTS() {
// TODO Auto-generated method stub
}
@Override
public void releaseTTSPlayer() {
// TODO Auto-generated method stub
}
@Override
public int playTTSText(String speech, int bPreempt) {
// TODO Auto-generated method stub
return 0;
}
@Override
public void phoneHangUp() {
// TODO Auto-generated method stub
}
@Override
public void phoneCalling() {
// TODO Auto-generated method stub
}
@Override
public void pauseTTS() {
// TODO Auto-generated method stub
}
@Override
public void initTTSPlayer() {
// TODO Auto-generated method stub
}
@Override
public int getTTSState() {
// TODO Auto-generated method stub
return 0;
}
};
}
<span style="white-space:pre"></span>
誘導Activity
BNDemoGuideActivity
package com.ht.activity;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import com.baidu.navisdk.adapter.BNRouteGuideManager;
import com.baidu.navisdk.adapter.BNRouteGuideManager.CustomizedLayerItem;
import com.baidu.navisdk.adapter.BNRouteGuideManager.OnNavigationListener;
import com.baidu.navisdk.adapter.BNRoutePlanNode;
import com.baidu.panosdk.plugin.indoor.R;
public class BNDemoGuideActivity extends Activity {
private BNRoutePlanNode mBNRoutePlanNode = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
createHandler();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {}
View view = BNRouteGuideManager.getInstance().onCreate(this, new OnNavigationListener() {
@Override
public void onNaviGuideEnd() {
finish();
}
@Override
public void notifyOtherAction(int actionType, int arg1, int arg2, Object obj) {
}
});
if ( view != null ) {
setContentView(view);
}
Intent intent = getIntent();
if (intent != null) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
mBNRoutePlanNode = (BNRoutePlanNode) bundle.getSerializable(MapActivity.ROUTE_PLAN_NODE);
}
}
}
@Override
protected void onResume() {
BNRouteGuideManager.getInstance().onResume();
super.onResume();
hd.sendEmptyMessageDelayed(MSG_SHOW, 5000);
}
protected void onPause() {
super.onPause();
BNRouteGuideManager.getInstance().onPause();
};
@Override
protected void onDestroy() {
BNRouteGuideManager.getInstance().onDestroy();
super.onDestroy();
}
@Override
protected void onStop() {
BNRouteGuideManager.getInstance().onStop();
super.onStop();
}
@Override
public void onBackPressed() {
BNRouteGuideManager.getInstance().onBackPressed(false);
}
public void onConfigurationChanged(android.content.res.Configuration newConfig) {
BNRouteGuideManager.getInstance().onConfigurationChanged(newConfig);
super.onConfigurationChanged(newConfig);
};
private void addCustomizedLayerItems() {
List<CustomizedLayerItem> items = new ArrayList<CustomizedLayerItem>();
CustomizedLayerItem item1 = null;
if (mBNRoutePlanNode != null) {
item1 = new CustomizedLayerItem(mBNRoutePlanNode.getLongitude(), mBNRoutePlanNode.getLatitude(),
mBNRoutePlanNode.getCoordinateType(), getResources().getDrawable(R.drawable.ic_launcher), CustomizedLayerItem.ALIGN_CENTER);
items.add(item1);
BNRouteGuideManager.getInstance().setCustomizedLayerItems(items);
}
BNRouteGuideManager.getInstance().showCustomizedLayer(true);
}
private static final int MSG_SHOW = 1;
private static final int MSG_HIDE = 2;
private Handler hd = null;
private void createHandler() {
if ( hd == null ) {
hd = new Handler(getMainLooper()) {
public void handleMessage(android.os.Message msg) {
if ( msg.what == MSG_SHOW ) {
addCustomizedLayerItems();
// hd.sendEmptyMessageDelayed(MSG_HIDE, 5000);
} else if ( msg.what == MSG_HIDE ) {
BNRouteGuideManager.getInstance().showCustomizedLayer(false);
// hd.sendEmptyMessageDelayed(MSG_SHOW, 5000);
}
};
};
}
}
}
各種權限,參考百度地圖api
謹記assets檔案夾下的第三方檔案要拷貝到自己的工程中