Android studio 百度地图开发(3)地图导航
Android studio 百度地图开发(3)地图导航
email:chentravelling@163.com
开发环境:win7 64位,Android Studio,请注意是Android Studio。使用的导航SDK版本号:3.1.0。
地图显示、project配置请參考:Android
studio 百度地图开发(1)配置project、显示地图
百度地图定位请參考:Android
studio 百度地图开发(2)地图定位
一.我为百度做点事
由于在写定位功能时自己想从头到尾地写,但最后全然是參考了百度官网上的Demo才弄出来,后来发现用Android Studio做导航的资料太少了,于是这次写导航功能的时候就直接參考了百度Demo。
可是问题依然,開始使用了百度的RoutePlanDemo.java这个Demo,发现有几个包找不到,捣腾了非常久没有成功。最后甚至准备用Myclipse试试,结果配置环境的时候还把MyEclipse玩坏了,重装。实在怀疑自己解决这个问题的能力,百般无奈之下,还是回到了Android
Studio,静下心来分析问题出在了哪里:是不是本身SDK3.1.0里就没有这几个包了呢?果然,我打开jar包一看。没有。欣喜,换了导航SDK3.1.0中的Demo+SDK3.1.0。于是。导航就真正開始了。以下的代码都来自百度Demo。我仅仅是自己理解了一番,后面将结合第二部分的地图定位和这部分的导航功能。自己再写一个能够实现手动选择起点和终点的Demo出来。喜欢吐槽的朋友请键盘留情。然后悄悄飘过吧。
一直以来都是喜欢百度的,虽然百度的的确确不能和Google比。
可是,在中国的科技氛围里,我认为百度已经够好了,所以也贴一点百度地图导航SDK的功能介绍。
最后,我想问问那些嘴里骂着百度心里又离不开百度的朋友:你为中国的科技、IT、社会做了什么?
二.导航SDK的应用
请注意:代码来自百度官方Demo。
导航SDK版本号:BaiDuNaviSDK_3.1.0.jar和httpmime-4.1.2.jar
IDE:Android Studio
第一步:project配置
这部分看似简单。没有关于Android Studio版的官方教程,真的非常麻烦。
(1)将BaiDuNaviSDK_3.1.0.jar和httpmime-4.1.2.jar拷贝到/libs目录下;
(2)方法一:右键这两个jar包:add as library->确定;
方法二:打开build.gradle,在dependencies中添加:
compile files('libs/httpmime-4.1.2.jar')
compile files('libs/BaiduNaviSDK_3.1.0.jar')
(3)在/src/main目录下新建assets,加入BaiduNaviSDK_Resource_X_X.png, BaiduNaviSDK _X_X.png和chanel文件【这三个文件能够在Demo中找到,直接复制过来就ok】
(4)在src/main/JNIlibs/armeabi-v7a中【不是armeabi】都加入:libapp_BaiduNaviApplib.so、libapp_BaiduVIlib.so、libcurl.so、libgnustl_shared.so、
libbds.so、 libbd_etts.so 、libBDSpeechDecoder_V1.so
第二步:AndroidManifest.xml:添加权限、注冊activity、API_KEY和定位服务
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="intvehapp.intvehapp" >
<!-- 百度地图API所需权限 -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 訪问精确位置的权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- SDK1.5须要android.permission.GET_TASKS权限推断本程序是否为当前执行的应用? -->
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!-- 来电消音 -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 摄影机 -->
<uses-permission android:name="android.permission.CAMERA" /> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<activity android:name=".BNDemoMainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--百度API_KEY-->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="iXDGdZtFiPifnNm6dUEFwDRXYQVeZ37V" />
<!--百度定位服务-->
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
<!--注冊activity-->
<activity android:name=".BNDemoGuideActivity" /> </application> </manifest>
第三步:BNDemoMainActivity.java
package intvehapp.intvehapp; import java.io.File;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List; import com.baidu.navisdk.adapter.BNOuterLogUtil;
import com.baidu.navisdk.adapter.BNOuterTTSPlayerCallback;
import com.baidu.navisdk.adapter.BNRoutePlanNode;
import com.baidu.navisdk.adapter.BNRoutePlanNode.CoordinateType;
import com.baidu.navisdk.adapter.BNaviSettingManager;
import com.baidu.navisdk.adapter.BaiduNaviManager;
import com.baidu.navisdk.adapter.BaiduNaviManager.NaviInitListener;
import com.baidu.navisdk.adapter.BaiduNaviManager.RoutePlanListener; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast; public class BNDemoMainActivity extends Activity { public static List<Activity> activityList = new LinkedList<Activity>();
/**
* App在SD卡中的文件夹名
*/
private static final String APP_FOLDER_NAME = "intvehapp";
/**
* 4个button控件
*/
private Button mWgsNaviBtn = null;
private Button mGcjNaviBtn = null;
private Button mBdmcNaviBtn = null;
private Button mDb06ll = null;
/**
* SD卡的路径
*/
private String mSDCardPath = null; public static final String ROUTE_PLAN_NODE = "routePlanNode";
public static final String SHOW_CUSTOM_ITEM = "showCustomItem";
public static final String RESET_END_NODE = "resetEndNode";
public static final String VOID_MODE = "voidMode"; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
activityList.add(this); setContentView(R.layout.activity_main_guide);
/**
* 获取button控件
*/
mWgsNaviBtn = (Button) findViewById(R.id.wgsNaviBtn);
mGcjNaviBtn = (Button) findViewById(R.id.gcjNaviBtn);
mBdmcNaviBtn = (Button) findViewById(R.id.bdmcNaviBtn);
mDb06ll = (Button) findViewById(R.id.mDb06llNaviBtn);
BNOuterLogUtil.setLogSwitcher(true);
/**
* 初始化button监听函数
*/
initListener();
if (initDirs()) {
/**
* 使用SDK前。先进行百度服务授权和引擎初始化。
*/
initNavi();
} // BNOuterLogUtil.setLogSwitcher(true);
} @Override
protected void onResume() {
super.onResume();
}
/**
* 为每个button控件添加点击监听事件,添加算路节点
*/
private void initListener() {
if (mWgsNaviBtn != null) {
mWgsNaviBtn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
/**
* 推断百度导航是否初始化
*/
if (BaiduNaviManager.isNaviInited()) {
/**
* 加入起点、终点
*/
routeplanToNavi(CoordinateType.WGS84);
}
} });
}
if (mGcjNaviBtn != null) {
mGcjNaviBtn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
if (BaiduNaviManager.isNaviInited()) {
routeplanToNavi(CoordinateType.GCJ02);
}
} });
}
if (mBdmcNaviBtn != null) {
mBdmcNaviBtn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) { if (BaiduNaviManager.isNaviInited()) {
routeplanToNavi(CoordinateType.BD09_MC);
}
}
});
} if (mDb06ll != null) {
mDb06ll.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (BaiduNaviManager.isNaviInited()) {
routeplanToNavi(CoordinateType.BD09LL);
}
}
});
} } /**
* 初始化SD卡,在SD卡路径下新建文件夹:App文件夹名。文件里包括了非常多东西。比方log、cache等等
* @return
*/
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;
} String authinfo = null; /**
* 内部TTS播报状态回传handler
*/
private Handler ttsHandler = new Handler() {
public void handleMessage(Message msg) {
int type = msg.what;
switch (type) {
case BaiduNaviManager.TTSPlayMsgType.PLAY_START_MSG: {
showToastMsg("Handler : TTS play start");
break;
}
case BaiduNaviManager.TTSPlayMsgType.PLAY_END_MSG: {
showToastMsg("Handler : TTS play end");
break;
}
default :
break;
}
}
}; /**
* 内部TTS播报状态回调接口
*/
private BaiduNaviManager.TTSPlayStateListener ttsPlayStateListener = new BaiduNaviManager.TTSPlayStateListener() { @Override
public void playEnd() {
// showToastMsg("TTSPlayStateListener : TTS play end");
} @Override
public void playStart() {
// showToastMsg("TTSPlayStateListener : TTS play start");
}
}; public void showToastMsg(final String msg) {
BNDemoMainActivity.this.runOnUiThread(new Runnable() { @Override
public void run() {
Toast.makeText(BNDemoMainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
} /**
* 使用SDK前。先进行百度服务授权和引擎初始化
*/
private void initNavi() { BNOuterTTSPlayerCallback ttsCallback = null; 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;
}
BNDemoMainActivity.this.runOnUiThread(new Runnable() { @Override
public void run() {
Toast.makeText(BNDemoMainActivity.this, authinfo, Toast.LENGTH_LONG).show();
}
});
} public void initSuccess() {
Toast.makeText(BNDemoMainActivity.this, "百度导航引擎初始化成功", Toast.LENGTH_SHORT).show();
initSetting();
} public void initStart() {
Toast.makeText(BNDemoMainActivity.this, "百度导航引擎初始化開始", Toast.LENGTH_SHORT).show();
} public void initFailed() {
Toast.makeText(BNDemoMainActivity.this, "百度导航引擎初始化失败", Toast.LENGTH_SHORT).show();
} }, null, ttsHandler, null); } private String getSdcardDir() {
if (Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)) {
return Environment.getExternalStorageDirectory().toString();
}
return null;
} /**
* 算路设置起、终点,算路偏好,是否模拟导航等參数,然后在回调函数中设置跳转至诱导。
* @param coType
*/
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;
}
case BD09LL: {
sNode = new BNRoutePlanNode(116.30784537597782, 40.057009624099436, "百度大厦", null, coType);
eNode = new BNRoutePlanNode(116.40386525193937, 39.915160800132085, "北京天安门", 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, //建议是应用的主Activity
list, //传入的算路节点。顺序是起点、途经点、终点,当中途经点最多三个
1, //算路偏好 1:推荐 8:少收费 2:快速优先 4:少走快速 16:躲避拥堵
true, //true表示真实GPS导航,false表示模拟导航
new DemoRoutePlanListener(sNode)//開始导航回调监听器,在该监听器里通常是进入导航过程页面
);
}
} /**
* 导航回调监听器
*/
public class DemoRoutePlanListener implements RoutePlanListener { private BNRoutePlanNode mBNRoutePlanNode = null; public DemoRoutePlanListener(BNRoutePlanNode node) {
mBNRoutePlanNode = node;
} @Override
public void onJumpToNavigator() {
/*
* 设置途径点以及resetEndNode会回调该接口
*/ for (Activity ac : activityList) { if (ac.getClass().getName().endsWith("BNDemoGuideActivity")) { return;
}
}
/**
* 导航activity
*/
Intent intent = new Intent(BNDemoMainActivity.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
Toast.makeText(BNDemoMainActivity.this, "算路失败", Toast.LENGTH_SHORT).show();
}
} /**
* 导航设置管理器
*/
private void initSetting(){
/**
* 日夜模式 1:自己主动模式 2:白天模式 3:夜间模式
*/
BNaviSettingManager.setDayNightMode(BNaviSettingManager.DayNightMode.DAY_NIGHT_MODE_DAY);
/**
* 设置全程路况显示
*/
BNaviSettingManager.setShowTotalRoadConditionBar(BNaviSettingManager.PreViewRoadCondition.ROAD_CONDITION_BAR_SHOW_ON);
/**
* 设置语音播报模式
*/
BNaviSettingManager.setVoiceMode(BNaviSettingManager.VoiceMode.Veteran);
/**
* 设置省电模式
*/
BNaviSettingManager.setPowerSaveMode(BNaviSettingManager.PowerSaveMode.DISABLE_MODE);
/**
* 设置实时路况条
*/
BNaviSettingManager.setRealRoadCondition(BNaviSettingManager.RealRoadCondition.NAVI_ITS_ON);
} private BNOuterTTSPlayerCallback mTTSCallback = new BNOuterTTSPlayerCallback() { @Override
public void stopTTS() {
// TODO Auto-generated method stub
Log.e("test_TTS", "stopTTS");
} @Override
public void resumeTTS() {
// TODO Auto-generated method stub
Log.e("test_TTS", "resumeTTS");
} @Override
public void releaseTTSPlayer() {
// TODO Auto-generated method stub
Log.e("test_TTS", "releaseTTSPlayer");
} @Override
public int playTTSText(String speech, int bPreempt) {
// TODO Auto-generated method stub
Log.e("test_TTS", "playTTSText" + "_" + speech + "_" + bPreempt); return 1;
} @Override
public void phoneHangUp() {
// TODO Auto-generated method stub
Log.e("test_TTS", "phoneHangUp");
} @Override
public void phoneCalling() {
// TODO Auto-generated method stub
Log.e("test_TTS", "phoneCalling");
} @Override
public void pauseTTS() {
// TODO Auto-generated method stub
Log.e("test_TTS", "pauseTTS");
} @Override
public void initTTSPlayer() {
// TODO Auto-generated method stub
Log.e("test_TTS", "initTTSPlayer");
} @Override
public int getTTSState() {
// TODO Auto-generated method stub
Log.e("test_TTS", "getTTSState");
return 1;
}
}; }
第四步:BNDemoGuideActivity.java
package intvehapp.intvehapp; import java.util.ArrayList;
import java.util.List; 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.navisdk.adapter.BNaviBaseCallbackModel;
import com.baidu.navisdk.adapter.BaiduNaviCommonModule;
import com.baidu.navisdk.adapter.NaviModuleFactory;
import com.baidu.navisdk.adapter.NaviModuleImpl;
import com.baidu.navisdk.adapter.BNRoutePlanNode.CoordinateType; import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View; /**
* 诱导界面
*
* @author sunhao04
*
*/
public class BNDemoGuideActivity extends Activity { private final String TAG = BNDemoGuideActivity.class.getName();
private BNRoutePlanNode mBNRoutePlanNode = null;
private BaiduNaviCommonModule mBaiduNaviCommonModule = null; /*
* 对于导航模块有两种方式来实现发起导航。 1:使用通用接口来实现 2:使用传统接口来实现
*/
// 是否使用通用接口
private boolean useCommonInterface = true; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); BNDemoMainActivity.activityList.add(this);
createHandler();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
}
View view = null;
if (useCommonInterface) {
//使用通用接口
mBaiduNaviCommonModule = NaviModuleFactory.getNaviModuleManager().getNaviCommonModule(
NaviModuleImpl.BNaviCommonModuleConstants.ROUTE_GUIDE_MODULE, this,
BNaviBaseCallbackModel.BNaviBaseCallbackConstants.CALLBACK_ROUTEGUIDE_TYPE, mOnNavigationListener);
if(mBaiduNaviCommonModule != null) {
mBaiduNaviCommonModule.onCreate();
view = mBaiduNaviCommonModule.getView();
} } else {
//使用传统接口
view = BNRouteGuideManager.getInstance().onCreate(this,mOnNavigationListener);
} if (view != null) {
setContentView(view);
} Intent intent = getIntent();
if (intent != null) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
mBNRoutePlanNode = (BNRoutePlanNode) bundle.getSerializable(BNDemoMainActivity.ROUTE_PLAN_NODE); }
}
} @Override
protected void onResume() {
super.onResume();
if(useCommonInterface) {
if(mBaiduNaviCommonModule != null) {
mBaiduNaviCommonModule.onResume();
}
} else {
BNRouteGuideManager.getInstance().onResume();
} if (hd != null) {
hd.sendEmptyMessageAtTime(MSG_SHOW, 2000);
}
} protected void onPause() {
super.onPause(); if(useCommonInterface) {
if(mBaiduNaviCommonModule != null) {
mBaiduNaviCommonModule.onPause();
}
} else {
BNRouteGuideManager.getInstance().onPause();
} }; @Override
protected void onDestroy() {
super.onDestroy();
if(useCommonInterface) {
if(mBaiduNaviCommonModule != null) {
mBaiduNaviCommonModule.onDestroy();
}
} else {
BNRouteGuideManager.getInstance().onDestroy();
}
BNDemoMainActivity.activityList.remove(this); } @Override
protected void onStop() {
super.onStop();
if(useCommonInterface) {
if(mBaiduNaviCommonModule != null) {
mBaiduNaviCommonModule.onStop();
}
} else {
BNRouteGuideManager.getInstance().onStop();
} } @Override
public void onBackPressed() {
if(useCommonInterface) {
if(mBaiduNaviCommonModule != null) {
mBaiduNaviCommonModule.onBackPressed(false);
}
} else {
BNRouteGuideManager.getInstance().onBackPressed(false);
}
} public void onConfigurationChanged(android.content.res.Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if(useCommonInterface) {
if(mBaiduNaviCommonModule != null) {
mBaiduNaviCommonModule.onConfigurationChanged(newConfig);
}
} else {
BNRouteGuideManager.getInstance().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 static final int MSG_RESET_NODE = 3;
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();
} else if (msg.what == MSG_HIDE) {
BNRouteGuideManager.getInstance().showCustomizedLayer(false);
} else if (msg.what == MSG_RESET_NODE) {
BNRouteGuideManager.getInstance().resetEndNodeInNavi(
new BNRoutePlanNode(116.21142, 40.85087, "百度大厦11", null, CoordinateType.GCJ02));
}
};
};
}
} private OnNavigationListener mOnNavigationListener = new OnNavigationListener() { @Override
public void onNaviGuideEnd() {
finish();
} @Override
public void notifyOtherAction(int actionType, int arg1, int arg2, Object obj) { if (actionType == 0) {
Log.i(TAG, "notifyOtherAction actionType = " + actionType + ",导航到达目的地!");
} Log.i(TAG, "actionType:" + actionType + "arg1:" + arg1 + "arg2:" + arg2 + "obj:" + obj.toString());
} };
}
第五步:Run看效果
三.个人理解
眼下Run起来后还有点问题,比方还没发现语音播报这个可不能够。
单从这个Demo来看,导航功能实现起来并不会复杂。百度服务授权和引擎初始化成功后,主要是传入起点、终点、途经点等须要计算的节点,然后在回调函数中进入导航回调监听器。然后进入诱导界面。
后面还有非常多地方能够个性化改动或者依照自己的须要进行功能完好。这便是后面我须要做的工作了。
可能第一次用Android Studio做百度地图真的会遇到不少问题,比方SDK版本号和.so文件(须要加入到armeabi-v7a目录中而不是armeabi中)总之,无论多难。不要轻易放弃。问题始终是能够解决的。
2016年4月30日补充:
问题描写叙述:百度导航引擎初始化失败。是的。失败!始终失败!似乎什么都配置对了。可是始终初始化失败!
解决方式:请注意上面的第一步project配置的第三项。。!
BaiduNaviSDK_Resource_3.1.0.png文件至关重要!
由于它不是一个简单的png图片,而是一个名副事实上的压缩包,将后缀改为.zip就能够解压看到里面压缩了非常多资源:对于这一点。我仅仅想说。这个坑。。。
百度挖的太深了。搞不懂百度这么做的意图。或许好好看看这个解压后的project就知道了~只是假设依照我上面的配置流程,是不会出现这个初始化失败的问题的~
Android studio 百度地图开发(3)地图导航的更多相关文章
- Android studio 百度地图开发(2)地图定位
Android studio 百度地图开发(2)地图定位 email:chentravelling@163.com 开发环境:win7 64位,Android Studio,请注意是Android S ...
- Android studio百度地图demo出现230错误,key校验失败
转自daoxiaomianzi原文 Android studio 百度地图demo出现230错误,key校验失败 使用AndroidStudio导入Baidu地图的as版的demo,引入后,发现没有k ...
- 百度地图开发-引入地图SDK并配置 02
百度地图开发-引入地图SDK并配置 02 通过上一篇文章的介绍,基本了解百度地图的基本信息,接下来就让我们一起来实际在项目中操作,显示出地图. 01 引入地图SDK 首先需要新建一个空白的Androi ...
- iOS原生地图开发进阶——使用导航和附近兴趣点检索
iOS原生地图开发进阶——使用导航和附近兴趣点检索 iOS中的mapKit框架对国际化的支持非常出色.在前些篇博客中,对这个地图框架的基础用法和标注与覆盖物的添加进行了详细的介绍,这篇博客将介绍两个更 ...
- Android Studio C/C++开发环境配置
Android Studio C/C++开发环境配置 我的开发环境 : Win 10 + android studio 1.5 一, 安装NDK 开发环境: 1. Settings -> ...
- IDEA插件(Android Studio插件)开发示例代码及bug解决
IDEA插件(Android Studio插件)开发示例代码及bug解决 代码在actionPerformed方法中,有个AnActionEvent e 插件开发就是要求我们复写上述的这个方法即可,在 ...
- 用Android studio进行 OpenCV 开发的第一个项目
我的天! 折腾了好久终于搭建成功了第一个项目. 项目环境: Windows 7 家庭普通版 64位 Android studio 1.5.1 OpenCV-2.4.9-android-sdk 基于 ...
- 【Flutter 1-2】在 Windows 10下安装Flutter+Dart+Android Studio 配置Flutter开发环境
在 Windows 10下安装Flutter+Dart+Android Studio 配置Flutter开发环境 文章首发地址 配置环境变量 由于部分网站被墙的原因,我们需要先配置Flutter国内镜 ...
- Android地图开发之地图的选择
做lbs开发差不多快2年了,地图相关的产品也差不多做了3个了,用到过的地图包括google地图.高德地图.百度地图.图吧.Osmdroid,今天总结下,方便大家开发时选择合适的地图. 首先说定位模块选 ...
随机推荐
- 【bzoj1485:】【 [HNOI2009]有趣的数列】模任意数的卡特兰数
(上不了p站我要死了,侵权度娘背锅) Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇 ...
- Android之Activity的启动模式
启动模式有4种,分别为:1.standard(默认) -- 标准2.singleTop -- 单顶3.singleTask -- 单任务4.singleInstance: -- 单例 -- 如果 ...
- java随机生成汉字
public static void main(String[] args) { String str = null; int hs, ls; Random random = new Random() ...
- Android - 标准VideoView播放演示样例
标准VideoView播放演示样例 本文地址: http://blog.csdn.net/caroline_wendy 在Android SDK中的ApiDemos内, 提供标准播放视频的代码,使用V ...
- sqoop使用记录
sqoop简介 Sqoop是用来实现结构型数据(如关系数据库)和Hadoop之间进行数据迁移的工具.它充分利用了MapReduce的并行特点以批处理的方式加快数据的传输,同时也借助MapReduce实 ...
- Java虚拟机内存分配和回收策略
1 对象优先分配在Eden区 对象优先在Eden进行分配,大多数情况下,对象在新生代Eden区进行分配.当Eden区没有足够的空间进行分配时,虚拟机会发起一次Minor GC. 新生代GC(Ninor ...
- ITIL,是否已是昨日黄花
首先声明自己不是ITIL方面的专家,特别是具体的规范细节,后面论述如有不当,请指正.但我为什么会提起它?主要是因为它和运维(IT服务管理)相关性太大了.早起的运维完全就是以ITIL来蓝本构建的,在当时 ...
- Excel 数据导入SQL XML 自动生成表头
去出差的时候应客户要求要要将Excel 文件内的数据批量导入到数据库中,而且有各种不同种类的表格,如果每一个表格多对应一个数据表的话, 按照正常的方法应该是创建数据表,创建数据库中映射的数据模型,然后 ...
- [React] Use react-rewards to add microinteractions to React app to reward users for some actions
It's important that our users enjoy using our application or website. One way we can make it happen ...
- node-表单验证
var http = require('http'); var url = require('url'); var fs = require('fs'); var querystring = requ ...