Android studio 百度地图开发(3)地图导航
Android studio 百度地图开发(3)地图导航
email:chentravelling@163.com
工程下载地址:http://blog.csdn.net/chentravelling/article/details/77113039
开发环境:win7 64位,Android Studio,请注意是Android Studio,使用的导航SDK版本:3.1.0。
地图显示、工程配置请参考:Android studio 百度地图开发(1)配置工程、显示地图
百度地图定位请参考: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
第一步:工程配置
这部分看似简单,没有关于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" /><applicationandroid: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-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="iXDGdZtFiPifnNm6dUEFwDRXYQVeZ37V" /><!--百度定位服务--><serviceandroid: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个按钮控件*/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";@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);activityList.add(this);setContentView(R.layout.activity_main_guide);/*** 获取按钮控件*/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);/*** 初始化按钮监听函数*/initListener();if (initDirs()) {/*** 使用SDK前,先进行百度服务授权和引擎初始化。*/initNavi(); }// BNOuterLogUtil.setLogSwitcher(true);}@Overrideprotected void onResume() {super.onResume();}/*** 为每一个按钮控件增加点击监听事件,增加算路节点*/private void initListener() {if (mWgsNaviBtn != null) {mWgsNaviBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {/*** 判断百度导航是否初始化*/if (BaiduNaviManager.isNaviInited()) {/*** 添加起点、终点*/routeplanToNavi(CoordinateType.WGS84);}}});}if (mGcjNaviBtn != null) {mGcjNaviBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {if (BaiduNaviManager.isNaviInited()) {routeplanToNavi(CoordinateType.GCJ02);}}});}if (mBdmcNaviBtn != null) {mBdmcNaviBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {if (BaiduNaviManager.isNaviInited()) {routeplanToNavi(CoordinateType.BD09_MC);}}});}if (mDb06ll != null) {mDb06ll.setOnClickListener(new OnClickListener() {@Overridepublic 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() {@Overridepublic void playEnd() {
// showToastMsg("TTSPlayStateListener : TTS play end");}@Overridepublic void playStart() {
// showToastMsg("TTSPlayStateListener : TTS play start");}};public void showToastMsg(final String msg) {BNDemoMainActivity.this.runOnUiThread(new Runnable() {@Overridepublic 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() {@Overridepublic void onAuthResult(int status, String msg) {if (0 == status) {authinfo = "key校验成功!";} else {authinfo = "key校验失败, " + msg;}BNDemoMainActivity.this.runOnUiThread(new Runnable() {@Overridepublic 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, //建议是应用的主Activitylist, //传入的算路节点,顺序是起点、途经点、终点,其中途经点最多三个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;}@Overridepublic 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);}@Overridepublic void onRoutePlanFailed() {// TODO Auto-generated method stubToast.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() {@Overridepublic void stopTTS() {// TODO Auto-generated method stubLog.e("test_TTS", "stopTTS");}@Overridepublic void resumeTTS() {// TODO Auto-generated method stubLog.e("test_TTS", "resumeTTS");}@Overridepublic void releaseTTSPlayer() {// TODO Auto-generated method stubLog.e("test_TTS", "releaseTTSPlayer");}@Overridepublic int playTTSText(String speech, int bPreempt) {// TODO Auto-generated method stubLog.e("test_TTS", "playTTSText" + "_" + speech + "_" + bPreempt);return 1;}@Overridepublic void phoneHangUp() {// TODO Auto-generated method stubLog.e("test_TTS", "phoneHangUp");}@Overridepublic void phoneCalling() {// TODO Auto-generated method stubLog.e("test_TTS", "phoneCalling");}@Overridepublic void pauseTTS() {// TODO Auto-generated method stubLog.e("test_TTS", "pauseTTS");}@Overridepublic void initTTSPlayer() {// TODO Auto-generated method stubLog.e("test_TTS", "initTTSPlayer");}@Overridepublic int getTTSState() {// TODO Auto-generated method stubLog.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;@Overrideprotected 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);}}}@Overrideprotected 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();}};@Overrideprotected void onDestroy() {super.onDestroy();if(useCommonInterface) {if(mBaiduNaviCommonModule != null) {mBaiduNaviCommonModule.onDestroy();}} else {BNRouteGuideManager.getInstance().onDestroy();}BNDemoMainActivity.activityList.remove(this);}@Overrideprotected void onStop() {super.onStop();if(useCommonInterface) {if(mBaiduNaviCommonModule != null) {mBaiduNaviCommonModule.onStop();}} else {BNRouteGuideManager.getInstance().onStop();}}@Overridepublic 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() {@Overridepublic void onNaviGuideEnd() {finish();}@Overridepublic 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日补充:
问题描述:百度导航引擎初始化失败!是的,失败!始终失败!似乎什么都配置对了,但是始终初始化失败!
解决方案:请注意上面的第一步工程配置的第三项!!!BaiduNaviSDK_Resource_3.1.0.png文件至关重要!因为它不是一个简单的png图片,而是一个名副其实的压缩包,将后缀改为.zip就可以解压看到里面压缩了很多资源:对于这一点,我只想说,这个坑。。。百度挖的太深了,搞不懂百度这么做的意图,也许好好看看这个解压后的工程就知道了~不过如果按照我上面的配置流程,是不会出现这个初始化失败的问题的~
Android studio 百度地图开发(3)地图导航相关推荐
- 用android studio测量距离,Android studio 百度地图开发(6)Marker绑定事件、计算两点距离...
Android studio 百度地图开发(6)Marker绑定事件.计算两点距离 email:chentravelling@163.com 开发环境:win7 64位,Android Studio, ...
- Android studio 百度地图开发(5)查询周边服务(加油站)
Android studio 百度地图开发(5)查询周边服务(加油站) email:chentravelling@163.com 开发环境:win7 64位,Android Studio,请注意是An ...
- Android studio课程设计开发实现---日记APP
Android studio课程设计开发实现-日记APP 文章目录 Android studio课程设计开发实现---日记APP 前言 一.效果 二.功能介绍 1.主要功能 2.涉及知识点 三.实现思 ...
- android studio ndk-builld方式开发
之前都是在Ubuntu开发,项目也是老的,自然也就顺理成章的用eclipse做各种android的开发.最近想在android studio 切换下,有点不习惯.android studio 为ndk ...
- android Studio 配置LUA 开发环境
android Studio 配置 LUA 开发环境 关于Android LUA资料 android如何调用lua? Android lua 教程 Lua官网 lua语言解释 Lua 5.1 参考手册 ...
- 26.Android Studio下Ndk开发(ffmpeg导入Android studio以cmake方式编译的过程)
Android studio 2.2开始支持cmake的方式进行jni开发,我在另一篇10.Eclipse下Ndk开发(ffmpeg解码)中写过Eclipse下编译ffmpeg的过程,但是现在几乎没有 ...
- 使用Android Studio 进行NDK开发和调试
2019独角兽企业重金招聘Python工程师标准>>> 尽管Android Studio已经越来越流行了,但很多人还是习惯于Eclipse或源码环境下开发JNI应用.个人认为使用An ...
- 使用 Android Studio 搭建安卓开发环境
使用 Android Studio 搭建安卓开发环境,方便.快捷.因为 Android SDK 等下载已经集成到 Android Studio 的安装中 1.官网下载 Android Studio ...
- android studio lua插件,android Studio 配置LUA 开发环境
android Studio 配置 LUA开发环境 关于Android LUA资料 引诉大牛的原话: Android 调用 Lua /Lua 调用 Android 代码 在Android项目中使用Lu ...
最新文章
- crypt错误分析和解决
- 分布式锁双重防死锁演进
- python使用post方式提交数据
- Java Calendar使用指南
- oracle 修改sgamaxsize_oracle初始化内存配置参数(sga,pga,sharepool)
- 详述近期遭利用的 Atlassian Confluence OGNL 注入漏洞 (CVE-2021-26084)
- SPOJ371 Boxes(最小费用最大流)
- 以“人民的名义”劝你快去读点书
- 这些跳槽理由千万不能说!
- 常用数据库及默认端口
- iOS-高德地图点击地图获取点击点对应的地理位置,并添加自定义的大头针
- win10计算机睡眠怎么设置密码,windows10系统设置待机密码的图文教程
- PoE供电六大常见问题大全解析
- pdcp层的作用_LTE系统中PDCP子层功能研究
- duang!各位期待的傻猴更新稳定版来了~
- python中time是什么意思_python中time的基本介绍
- matlab如何在极坐标绘图,Matlab在极坐标中绘图
- OVP保护芯片首选ETA7008,耐压36V,过压保护点可调
- Linux shell实现阶乘
- JAVA 浏览器下载excel,自定义样式:合并单元格,设置多种背景填充颜色,冻结窗格