集成百度地图导航其实很简单,但是必须要在百度TT语音播报后台成功注册了注册地址注册时候很简单我就不赘述了,
上代码:
TodaytaskdetailActivity .java
package com.wdkj.housemanager.activity;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
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.navisdk.adapter.BNCommonSettingParam;
import com.baidu.navisdk.adapter.BNOuterLogUtil;
import com.baidu.navisdk.adapter.BNOuterTTSPlayerCallback;
import com.baidu.navisdk.adapter.BNRoutePlanNode;
import com.baidu.navisdk.adapter.BNaviSettingManager;
import com.baidu.navisdk.adapter.BaiduNaviManager;
import com.bumptech.glide.Glide;
import com.wdkj.housemanager.R;
import com.wdkj.housemanager.bean.Constant;
import com.wdkj.housemanager.bean.SuccessdEvent;
import com.wdkj.housemanager.bean.TaskItemBean;
import com.wdkj.housemanager.view.CircleImageView;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import java.io.File;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import static com.baidu.navisdk.adapter.BNRoutePlanNode.CoordinateType.BD09LL;
import static com.baidu.navisdk.adapter.BNRoutePlanNode.CoordinateType.WGS84;
import static com.baidu.navisdk.adapter.PackageUtil.getSdcardDir;
import static com.baidu.navisdk.adapter.PackageUtil.init;
/**
* 今日任务详情
*/
public class TodaytaskdetailActivity extends Activity implements View.OnClickListener {
@BindView(R.id.ll_back)
LinearLayout llBack;
@BindView(R.id.tv_creatperson)
TextView tvCreatperson;
@BindView(R.id.tv_task)
TextView tvTask;
@BindView(R.id.iv_person)
CircleImageView ivPerson;
@BindView(R.id.tv_execuperson)
TextView tvExecuperson;
@BindView(R.id.tv_category)
TextView tvCategory;
@BindView(R.id.tv_name)
TextView tvName;
@BindView(R.id.tv_status)
TextView tvStatus;
@BindView(R.id.tv_starttime)
TextView tvStarttime;
@BindView(R.id.tv_endtime)
TextView tvEndtime;
@BindView(R.id.tv_overtime)
TextView tv_overtime;
@BindView(R.id.tv_content)
TextView tvContent;
@BindView(R.id.wb_location)
WebView wbLocation;
@BindView(R.id.ll_save)
LinearLayout llSave;
@BindView(R.id.ll_photo)
LinearLayout llPhoto;
@BindView(R.id.ll_onwer)
LinearLayout llOnwer;
@BindView(R.id.sc_view)
ScrollView scView;
@BindView(R.id.iv_housesave)
ImageView ivHousesave;
@BindView(R.id.iv_housephoto)
ImageView ivHousephoto;
@BindView(R.id.iv_housejd)
ImageView ivHousejd;
@BindView(R.id.tv_housesave)
TextView tvHousesave;
@BindView(R.id.tv_housephoto)
TextView tvHousephoto;
@BindView(R.id.tv_housejd)
TextView tvHousejd;
@BindView(R.id.ll_newbottom)
LinearLayout llNewbottom;
@BindView(R.id.ll_task_map)
LinearLayout llTaskmap;
private TaskItemBean detailBean;
private WebSettings webSettings;
private int requestCode;
private static final String[] authBaseArr = { Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION };
private static final String[] authComArr = { Manifest.permission.READ_PHONE_STATE };
public static List<Activity> activityList = new LinkedList<Activity>();
private static final int authBaseRequestCode = 1;
private static final int authComRequestCode = 2;
private boolean hasInitSuccess = false;
private boolean hasRequestComAuth = false;
public static final String ROUTE_PLAN_NODE = "routePlanNode";
private String mSDCardPath = null;
private static final String APP_FOLDER_NAME = "BNSDKSimpleDemo";
private static final String TAG = "TodaytaskdetailActivity";
private MyLocationListener myListener;
private LocationClient mLocationClient;
private double mCurrentLat,mCurrentLon;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityList.add(this);
setContentView(R.layout.activity_todaytaskdetail);
ButterKnife.bind(this);
if (getIntent() != null) {
detailBean = (TaskItemBean) getIntent().getSerializableExtra("todaytaskBean");
requestCode = getIntent().getIntExtra("requestCode", 0);
}
initLocation();
EventBus.getDefault().register(this);
scView.smoothScrollTo(0, 0);
llTaskmap.setOnClickListener(this);//点击导航
}
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");
}
};
private void initNavi() {
BNOuterTTSPlayerCallback ttsCallback = null;
// 申请权限
if (android.os.Build.VERSION.SDK_INT >= 23) {
if (!hasBasePhoneAuth()) {
this.requestPermissions(authBaseArr, authBaseRequestCode);
return;
}
}
BaiduNaviManager.getInstance().init(this, mSDCardPath, APP_FOLDER_NAME, new BaiduNaviManager.NaviInitListener() {
@Override
public void onAuthResult(int status, String msg) {
if (0 == status) {
authinfo = "key校验成功!";
} else {
authinfo = "key校验失败, " + msg;
}
// TodaytaskdetailActivity.this.runOnUiThread(new Runnable() {
//
// @Override
// public void run() {
// Toast.makeText(TodaytaskdetailActivity.this, authinfo, Toast.LENGTH_LONG).show();
// }
// });
}
public void initSuccess() {
//Toast.makeText(TodaytaskdetailActivity.this,"百度导航引擎初始化成功", Toast.LENGTH_SHORT).show();
hasInitSuccess = true;
initSetting();
}
public void initStart() {
//Toast.makeText(TodaytaskdetailActivity.this, "百度导航引擎初始化开始", Toast.LENGTH_SHORT).show();
}
public void initFailed() {
//Toast.makeText(TodaytaskdetailActivity.this, "百度导航引擎初始化失败", Toast.LENGTH_SHORT).show();
}
}, null, ttsHandler, ttsPlayStateListener);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ll_task_map:
if (BaiduNaviManager.isNaviInited()) {
Toast.makeText(TodaytaskdetailActivity.this,"即将开始导航",Toast.LENGTH_SHORT).show();
routeplanToNavi();
}
break;
}
}
private BNRoutePlanNode.CoordinateType mCoordinateType = null;
// private void routeplanToNavi(BNRoutePlanNode.CoordinateType coType) {
private void routeplanToNavi() {
// mCoordinateType = coType;
if (!hasInitSuccess) {
//Toast.makeText(TodaytaskdetailActivity.this, "还未初始化!", Toast.LENGTH_SHORT).show();
}
// 权限申请
if (android.os.Build.VERSION.SDK_INT >= 23) {
// 保证导航功能完备
if (!hasCompletePhoneAuth()) {
if (!hasRequestComAuth) {
hasRequestComAuth = true;
this.requestPermissions(authComArr, authComRequestCode);
return;
} else {
//Toast.makeText(TodaytaskdetailActivity.this, "没有完备的权限!", Toast.LENGTH_SHORT).show();
}
}
}
BNRoutePlanNode sNode = null;
BNRoutePlanNode eNode = null;
sNode = new BNRoutePlanNode(mCurrentLon, mCurrentLat,null, null, BD09LL);//起点
eNode = new BNRoutePlanNode(detailBean.getLon(), detailBean.getLat(),null, null, WGS84);//终点
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 BaiduNaviManager.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;
}
}
Intent intent = new Intent(TodaytaskdetailActivity.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(TodaytaskdetailActivity.this, "算路失败", Toast.LENGTH_SHORT).show();
}
}
private void initSetting() {
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);
Bundle bundle = new Bundle();
// 必须设置APPID,否则会静音
bundle.putString(BNCommonSettingParam.TTS_APP_ID, "9480303");//将TTS申请的语音设置好
BNaviSettingManager.setNaviSdkParam(bundle);
}
@Subscribe
public void onEventMainThread(SuccessdEvent event) {
if (event.getCode() == 100 || event.getCode() == 300) {
detailBean.setStatus(2);
}
}
private boolean hasBasePhoneAuth() {
// TODO Auto-generated method stub
PackageManager pm = this.getPackageManager();
for (String auth : authBaseArr) {
if (pm.checkPermission(auth, this.getPackageName()) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
private boolean hasCompletePhoneAuth() {
// TODO Auto-generated method stub
PackageManager pm = this.getPackageManager();
for (String auth : authComArr) {
if (pm.checkPermission(auth, this.getPackageName()) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
@Override
protected void onResume() {
super.onResume();
}
/**
* 初始化定位
*/
private void initLocation(){
// 开启定位图层
myListener = new MyLocationListener();
mLocationClient = new LocationClient(TodaytaskdetailActivity.this);
mLocationClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(60000);
mLocationClient.setLocOption(option);
mLocationClient.start();
}
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(final BDLocation location) {
//获取定位结果
// map view 销毁后不在处理新接收的位置
if (location == null) {
return;
}
mCurrentLat = location.getLatitude();
mCurrentLon = location.getLongitude();
//开始初始化导航信息
BNOuterLogUtil.setLogSwitcher(true);
if (initDirs()) {
initNavi();
}
}
@Override
public void onConnectHotSpotMessage(String s, int i) {
}
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
// 退出时销毁定位
mLocationClient.stop();
}
}
BNDemoGuideActivity.java
package com.wdkj.housemanager.activity;
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 com.wdkj.housemanager.R;
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);
TodaytaskdetailActivity.activityList.add(this);//添加到TodaytaskdetailActivity中
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(TodaytaskdetailActivity.ROUTE_PLAN_NODE);
}
}
//显示自定义图标
if (hd != null) {
hd.sendEmptyMessageAtTime(MSG_SHOW, 5000);
}
}
@Override
protected void onResume() {
super.onResume();
if(useCommonInterface) {
if(mBaiduNaviCommonModule != null) {
mBaiduNaviCommonModule.onResume();
}
} else {
BNRouteGuideManager.getInstance().onResume();
}
}
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();
}
TodaytaskdetailActivity.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(true);
}
} 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);
}
};
@Override
public boolean onKeyDown(int keyCode, android.view.KeyEvent event) {
if(useCommonInterface) {
if(mBaiduNaviCommonModule != null) {
Bundle mBundle = new Bundle();
mBundle.putInt(RouteGuideModuleConstants.KEY_TYPE_KEYCODE, keyCode);
mBundle.putParcelable(RouteGuideModuleConstants.KEY_TYPE_EVENT, event);
mBaiduNaviCommonModule.setModuleParams(RouteGuideModuleConstants.METHOD_TYPE_ON_KEY_DOWN, mBundle);
try {
Boolean ret = (Boolean)mBundle.get(RET_COMMON_MODULE);
if(ret) {
return true;
}
}catch(Exception e){
e.printStackTrace();
}
}
}
return super.onKeyDown(keyCode, event);
}
@Override
protected void onStart() {
super.onStart();
// TODO Auto-generated method stub
if(useCommonInterface) {
if(mBaiduNaviCommonModule != null) {
mBaiduNaviCommonModule.onStart();
}
} else {
BNRouteGuideManager.getInstance().onStart();
}
}
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.mipmap.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());
}
};
private final static String RET_COMMON_MODULE = "module.ret";
private interface RouteGuideModuleConstants {
final static int METHOD_TYPE_ON_KEY_DOWN = 0x01;
final static String KEY_TYPE_KEYCODE = "keyCode";
final static String KEY_TYPE_EVENT = "event";
}
}
在AndroidManifest.xml中配置
<activity
android:name=".activity.BNDemoGuideActivity"
android:configChanges="orientation|screenSize|keyboard|keyboardHidden"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
效果如下: