天天看點

Android 不歸路之百度地圖API學習(導航篇)

在學習百度地圖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檔案夾下的第三方檔案要拷貝到自己的工程中

繼續閱讀