简介:

公司的项目用到了高德的导航功能,所以自己总结了一下高德的导航,希望对大家有所帮助。该功能集成了高德的导航和讯飞的语音播报。

集成步骤:

1) 到高德地图官网,申请账号和KEY, 进行集成

添加依赖,并且在app目录下的build,gradle文件中配置:

2) 在清单文件中添加权限以及配置:

这是配置的步骤。

3) 功能的实现,废话少说,直接上代码;

public class MainActivity extends Activity implements AMapNaviListener,View.OnClickListener, CompoundButton.OnCheckedChangeListener,LocationSource,AMapLocationListener {private boolean congestion, cost, hightspeed, avoidhightspeed;      //筛选路线条件/*** 导航对象(单例)*/private AMapNavi mAMapNavi;private AMap mAmap;/*** 地图对象*/private MapView mRouteMapView;private Marker mStartMarker;private Marker mEndMarker;/*** 选择起点Action标志位*/private boolean mapClickStartReady;/*** 选择终点Aciton标志位*/private boolean mapClickEndReady;private NaviLatLng endLatlng = new NaviLatLng(39.955846, 116.352765);private NaviLatLng startLatlng = new NaviLatLng(39.925041, 116.437901);private List<NaviLatLng> startList = new ArrayList<NaviLatLng>();/*** 途径点坐标集合*/private List<NaviLatLng> wayList = new ArrayList<NaviLatLng>();/*** 终点坐标集合[建议就一个终点]*/private List<NaviLatLng> endList = new ArrayList<NaviLatLng>();/*** 保存当前算好的路线*/private SparseArray<RouteOverLay> routeOverlays = new SparseArray<RouteOverLay>();/*** 当前用户选中的路线,在下个页面进行导航*/private int routeIndex;/**路线的权值,重合路线情况下,权值高的路线会覆盖权值低的路线**/private int zindex = 1;/*** 路线计算成功标志位*/private boolean calculateSuccess = false;       //路线计算状态private boolean chooseRouteSuccess = false;     //路径选择状态private boolean mFirstFix=false;                    //记录是否第一次定位private AMapLocationClient mlocationClient;           //定位服务类private AMapLocationClientOption mLocationOption;     //设置定位参数private OnLocationChangedListener mListener;private final int SDK_PERMISSION = 1;                //申请权限@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mRouteMapView = (MapView) findViewById(R.id.navi_view);mRouteMapView.onCreate(savedInstanceState);mAmap = mRouteMapView.getMap();init();                                             //调用初始化控件方法getPersimmions();                                   //获取定位动态权限}/*** 初始化控件*/private void init() {//获取布局文件中的控件CheckBox congestion = (CheckBox) findViewById(R.id.congestion);CheckBox cost = (CheckBox) findViewById(R.id.cost);CheckBox hightspeed = (CheckBox) findViewById(R.id.hightspeed);CheckBox avoidhightspeed = (CheckBox) findViewById(R.id.avoidhightspeed);Button calculate = (Button) findViewById(R.id.calculate);Button startPoint = (Button) findViewById(R.id.startpoint);Button endPoint = (Button) findViewById(R.id.endpoint);Button selectroute = (Button) findViewById(R.id.selectroute);Button gpsnavi = (Button) findViewById(R.id.gpsnavi);//设置控件的单击事件calculate.setOnClickListener(this);startPoint.setOnClickListener(this);endPoint.setOnClickListener(this);selectroute.setOnClickListener(this);gpsnavi.setOnClickListener(this);//复选框事件congestion.setOnCheckedChangeListener(this);cost.setOnCheckedChangeListener(this);hightspeed.setOnCheckedChangeListener(this);avoidhightspeed.setOnCheckedChangeListener(this);/*** 地图单击事件,实现在地图中选择起点与终点*/mAmap.setOnMapClickListener(new AMap.OnMapClickListener() {@Overridepublic void onMapClick(LatLng latLng) {//控制选起点if (mapClickStartReady) {//设置选中起点的坐标startLatlng = new NaviLatLng(latLng.latitude, latLng.longitude);mStartMarker.setPosition(latLng);           //在起点坐标位置绘制起点图标startList.clear();                          //清除起点坐标startList.add(startLatlng);                //保存起点坐标mapClickStartReady = false;                //设置起点标志状态}//控制选终点if (mapClickEndReady) {endLatlng = new NaviLatLng(latLng.latitude, latLng.longitude);mEndMarker.setPosition(latLng);endList.clear();endList.add(endLatlng);mapClickEndReady = false;}}});StartMarker();          //获取起点图标EndMarker();            //获取终点图标//创建导航对象mAMapNavi = AMapNavi.getInstance(getApplicationContext());mAMapNavi.addAMapNaviListener(this);    //添加导航事件回调监听setUpMap();                              //调用设置地图属性方法}//获取起点图标private void StartMarker() {// 获取设置起点的图标mStartMarker = mAmap.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.start))));}//获取终点图标private void EndMarker() {mEndMarker = mAmap.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.end))));}/*** 添加定位动态权限*/private void getPersimmions() {/**** 定位权限为必须权限,用户如果禁止,则每次进入都会申请*/if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {ArrayList<String> permissions = new ArrayList<String>();// 定位精确位置if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);}if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);}if (permissions.size() > 0) {requestPermissions(permissions.toArray(new String[permissions.size()]), SDK_PERMISSION);}}}/***动态权限的回调方法*/@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);activate(mListener);         //调用激活定位}/*** 设置一些amap的属性*/private void setUpMap() {//定位mAmap.setLocationSource(this);// 设置定位监听mAmap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示mAmap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false// 设置定位的类型为定位模式 ,可以由定位 LOCATION_TYPE_LOCATE、跟随 LOCATION_TYPE_MAP_FOLLOW 或地图根据面向方向旋转 LOCATION_TYPE_MAP_ROTATEmAmap.setMyLocationType(AMap.LOCATION_TYPE_MAP_ROTATE);}/*** 定位成功后回调函数*/@Overridepublic void onLocationChanged(AMapLocation amapLocation) {if (mListener != null && amapLocation != null) {if (amapLocation != null&& amapLocation.getErrorCode() == 0) {mListener.onLocationChanged(amapLocation);// 显示系统小蓝点//保存经纬度LatLng location = new LatLng(amapLocation.getLatitude(),amapLocation.getLongitude());if (!mFirstFix) {       //判断第一次进入地图//显示当前位置信息Toast.makeText(this, amapLocation.getAddress() + "", Toast.LENGTH_SHORT).show();mFirstFix = true;   //修改状态//更新可视区域位置mAmap.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 16));}} else {String errText = "定位失败," + amapLocation.getErrorCode()+ ": " + amapLocation.getErrorInfo();Toast.makeText(this, errText, Toast.LENGTH_SHORT).show();}}}/*** 激活定位*/@Overridepublic void activate(OnLocationChangedListener listener) {mListener = listener;if (mlocationClient == null) {  //如果定位服务为空mlocationClient = new AMapLocationClient(this);     //创建定位服务类mLocationOption = new AMapLocationClientOption();   //创建设置定位参数类//设置定位监听mlocationClient.setLocationListener(this);//设置为高精度定位模式mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//设置定位参数mlocationClient.setLocationOption(mLocationOption);// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,// 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求// 在定位结束后,在合适的生命周期调用onDestroy()方法// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除mlocationClient.startLocation();}}/*** 停止定位*/@Overridepublic void deactivate() {if (mlocationClient != null) {mlocationClient.stopLocation();mlocationClient.onDestroy();}mlocationClient = null;}/*** 界面获取焦点时同时获取地图焦点*/@Overrideprotected void onResume() {super.onResume();mRouteMapView.onResume();}/*** 界面停止时停止地图,并清理地图路线数据与线路*/@Overrideprotected void onPause() {super.onPause();mRouteMapView.onPause();startList.clear();wayList.clear();endList.clear();routeOverlays.clear();}/*** 方法必须重写*/@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);mRouteMapView.onSaveInstanceState(outState);}/*** 销毁地图*/@Overrideprotected void onDestroy() {super.onDestroy();mRouteMapView.onDestroy();/*** 当前页面只是展示地图,activity销毁后不需要再回调导航的状态*/mAMapNavi.removeAMapNaviListener(this);//注意:不要调用这个destory方法,因为在当前页面进行算路,算路成功的数据全部存在此对象中。到另外一个activity中只需要开始导航即可。//如果用户是回退退出当前activity,可以调用下面的destory方法。//mAMapNavi.destroy();}/***路线筛选条件的复选框事件处理*/@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {int id = buttonView.getId();switch (id) {case R.id.congestion:congestion = isChecked;             //选中躲避拥堵break;case R.id.avoidhightspeed:avoidhightspeed = isChecked;        //选中不走高速break;case R.id.cost:cost = isChecked;                    //选中躲避收费break;case R.id.hightspeed:hightspeed = isChecked;             //选中高速优先break;default:break;}}@Overridepublic void onInitNaviSuccess() {}/***多路线绘制*/@Overridepublic void onCalculateMultipleRoutesSuccess(int[] ints) {//清空上次计算的路径列表。routeOverlays.clear();HashMap<Integer, AMapNaviPath> paths = mAMapNavi.getNaviPaths();for (int i = 0; i < ints.length; i++) {AMapNaviPath path = paths.get(ints[i]);if (path != null) {drawRoutes(ints[i], path);}}}/*** 单路线绘制*/@Overridepublic void onCalculateRouteSuccess() {/*** 清空上次计算的路径列表。*/routeOverlays.clear();AMapNaviPath path = mAMapNavi.getNaviPath();/*** 单路径不需要进行路径选择,直接传入-1即可*/drawRoutes(-1, path);}@Overridepublic void onCalculateRouteFailure(int arg0) {calculateSuccess = false;Toast.makeText(getApplicationContext(), "计算路线失败,errorcode=" + arg0, Toast.LENGTH_SHORT).show();}/***画出路线*/private void drawRoutes(int routeId, AMapNaviPath path) {calculateSuccess = true;        //设置路线状态mAmap.moveCamera(CameraUpdateFactory.changeTilt(0));  //设置地图倾斜角度为0//构造导航路线图层RouteOverLay routeOverLay = new RouteOverLay(mAmap, path, this);routeOverLay.setTrafficLine(true);                    //开启交通线routeOverLay.addToMap();                              //添加驾车/步行路线添加到地图上显示routeOverlays.put(routeId, routeOverLay);           //保存当前算好的路线}/*** 改变路线*/public void changeRoute() {if (!calculateSuccess) {Toast.makeText(this, "请先算路", Toast.LENGTH_SHORT).show();return;}/*** 计算出来的路径只有一条*/if (routeOverlays.size() == 1) {chooseRouteSuccess = true;Toast.makeText(this, "导航距离:" + (mAMapNavi.getNaviPath()).getAllLength() + "m" + "\n" + "导航时间:" + (mAMapNavi.getNaviPath()).getAllTime() + "s", Toast.LENGTH_SHORT).show();return;}if (routeIndex >= routeOverlays.size())routeIndex = 0;int routeID = routeOverlays.keyAt(routeIndex);//突出选择的那条路for (int i = 0; i < routeOverlays.size(); i++) {int key = routeOverlays.keyAt(i);routeOverlays.get(key).setTransparency(0.7f);}routeOverlays.get(routeID).setTransparency(0);/**把用户选择的那条路的权值弄高,使路线高亮显示的同时,重合路段不会变的透明**/routeOverlays.get(routeID).setZindex(zindex++);//必须告诉AMapNavi 你最后选择的哪条路mAMapNavi.selectRouteId(routeID);Toast.makeText(this, "导航距离:" + (mAMapNavi.getNaviPaths()).get(routeID).getStrategy()+ "\n" + "导航时间:" +(mAMapNavi.getNaviPaths()).get(routeID).getAllTime() +"s", Toast.LENGTH_SHORT).show();routeIndex++;chooseRouteSuccess = true;}/*** 清除当前地图上算好的路线*/private void clearRoute() {for (int i = 0; i < routeOverlays.size(); i++) {RouteOverLay routeOverlay = routeOverlays.valueAt(i);routeOverlay.removeFromMap();}routeOverlays.clear();}/***按钮单击事件*/@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.calculate:                   //开始算路按钮clearRoute();                       //清除当前地图上算好的路线mapClickStartReady = false;      //设置起点状态mapClickEndReady = false;        //设置终点状态if (avoidhightspeed && hightspeed) {Toast.makeText(getApplicationContext(), "不走高速与高速优先不能同时为true.", Toast.LENGTH_LONG).show();}if (cost && hightspeed) {Toast.makeText(getApplicationContext(), "高速优先与避免收费不能同时为true.", Toast.LENGTH_LONG).show();}mStartMarker.remove();             //清除不准确的起点图标/** strategyFlag转换出来的值都对应PathPlanningStrategy常量,用户也可以直接传入PathPlanningStrategy常量进行算路。* 如:mAMapNavi.calculateDriveRoute(mStartList, mEndList, mWayPointList,PathPlanningStrategy.DRIVING_DEFAULT);*/int strategyFlag = 0;try {//进行算路策略转换,将传入的特定规则转换成PathPlanningStrategy的枚举值strategyFlag = mAMapNavi.strategyConvert(congestion, avoidhightspeed, cost, hightspeed, true);} catch (Exception e) {e.printStackTrace();}if (strategyFlag >= 0) {//计算驾车路径(包含起点)mAMapNavi.calculateDriveRoute(startList, endList, wayList, strategyFlag);Toast.makeText(getApplicationContext(), "策略:" + strategyFlag, Toast.LENGTH_LONG).show();}break;case R.id.startpoint:       //选择起点按钮Toast.makeText(this, "请在地图上点选起点", Toast.LENGTH_SHORT).show();mapClickStartReady = true;      //设置起点状态StartMarker();                     //获取起点图标break;case R.id.endpoint:Toast.makeText(this, "请在地图上点选终点", Toast.LENGTH_SHORT).show();mapClickEndReady = true;break;case R.id.selectroute:          //选择路径按钮changeRoute();                //改变路线方法break;case R.id.gpsnavi:              //开始导航按钮Intent gpsintent = new Intent(getApplicationContext(), RouteNaviActivity.class);gpsintent.putExtra("gps", true);startActivity(gpsintent);    //跳转导航界面this.finish();break;default:break;}}/*** ************************************************** 在算路页面,以下接口全不需要处理,在以后的版本中我们会进行优化*************************************************************************************************/@Overridepublic void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo arg0) {}@Overridepublic void OnUpdateTrafficFacility(TrafficFacilityInfo arg0) {}@Overridepublic void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo[] arg0) {}@Overridepublic void hideCross() {}@Overridepublic void hideLaneInfo() {}@Overridepublic void notifyParallelRoad(int arg0) {}@Overridepublic void onArriveDestination() {}@Overridepublic void onArriveDestination(NaviStaticInfo naviStaticInfo) {}@Overridepublic void onArriveDestination(AMapNaviStaticInfo aMapNaviStaticInfo) {}@Overridepublic void onArrivedWayPoint(int arg0) {}@Overridepublic void onEndEmulatorNavi() {}@Overridepublic void onGetNavigationText(int arg0, String arg1) {}@Overridepublic void onGpsOpenStatus(boolean arg0) {}@Overridepublic void onInitNaviFailure() {}@Overridepublic void onLocationChange(AMapNaviLocation arg0) {}@Overridepublic void onNaviInfoUpdate(NaviInfo arg0) {}@Overridepublic void onNaviInfoUpdated(AMapNaviInfo arg0) {}@Overridepublic void onReCalculateRouteForTrafficJam() {}@Overridepublic void onReCalculateRouteForYaw() {}@Overridepublic void onStartNavi(int arg0) {}@Overridepublic void onTrafficStatusUpdate() {}@Overridepublic void showCross(AMapNaviCross arg0) {}@Overridepublic void showLaneInfo(AMapLaneInfo[] arg0, byte[] arg1, byte[] arg2) {}@Overridepublic void updateAimlessModeCongestionInfo(AimLessModeCongestionInfo arg0) {}@Overridepublic void updateAimlessModeStatistics(AimLessModeStat arg0) {}}

4) 实现导航和语音播报

public class RouteNaviActivity extends Activity implements AMapNaviListener, AMapNaviViewListener {AMapNaviView mAMapNaviView;       //构造导航视图AMapNavi mAMapNavi;             //导航控制TTSController mTtsManager;       //讯飞语音播报组件@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_basic_navi);//初始化语音播报组件mTtsManager = TTSController.getInstance(getApplicationContext());mTtsManager.init();mAMapNaviView = (AMapNaviView) findViewById(R.id.navi_view);      //获取导航控件mAMapNaviView.onCreate(savedInstanceState);                    //导航与界面同步//设置导航界面按钮的回调监听mAMapNaviView.setAMapNaviViewListener(this);mAMapNavi = AMapNavi.getInstance(getApplicationContext());        //创建导航对象mAMapNavi.addAMapNaviListener(this);                        //添加导航事件回调监听mAMapNavi.addAMapNaviListener(mTtsManager);                   //注册导航语音mAMapNavi.setEmulatorNaviSpeed(60);                         //设置模拟导航的速度boolean gps=getIntent().getBooleanExtra("gps", false);if(gps){mAMapNavi.startNavi(AMapNavi.GPSNaviMode);                //gps导航}}@Overrideprotected void onResume() {super.onResume();mAMapNaviView.onResume();}@Overrideprotected void onPause() {super.onPause();mAMapNaviView.onPause();//        仅仅是停止你当前在说的这句话,一会到新的路口还是会再说的mTtsManager.stopSpeaking();////        停止导航之后,会触及底层stop,然后就不会再有回调了,但是讯飞当前还是没有说完的半句话还是会说完//        mAMapNavi.stopNavi();}@Overrideprotected void onDestroy() {super.onDestroy();mAMapNaviView.onDestroy();mAMapNavi.stopNavi();mAMapNavi.destroy();mTtsManager.destroy();}@Overridepublic void onInitNaviFailure() {Toast.makeText(this, "init navi Failed", Toast.LENGTH_SHORT).show();}@Overridepublic void onInitNaviSuccess() {}@Overridepublic void onStartNavi(int type) {}@Overridepublic void onTrafficStatusUpdate() {}@Overridepublic void onLocationChange(AMapNaviLocation location) {}@Overridepublic void onGetNavigationText(int type, String text) {}@Overridepublic void onEndEmulatorNavi() {}@Overridepublic void onArriveDestination() {}@Overridepublic void onArriveDestination(NaviStaticInfo naviStaticInfo) {}@Overridepublic void onArriveDestination(AMapNaviStaticInfo aMapNaviStaticInfo) {}@Overridepublic void onCalculateRouteSuccess() {}@Overridepublic void onCalculateRouteFailure(int errorInfo) {}@Overridepublic void onReCalculateRouteForYaw() {}@Overridepublic void onReCalculateRouteForTrafficJam() {}@Overridepublic void onArrivedWayPoint(int wayID) {}@Overridepublic void onGpsOpenStatus(boolean enabled) {}@Overridepublic void onNaviSetting() {}@Overridepublic void onNaviMapMode(int isLock) {}@Overridepublic void onNaviCancel() {finish();}@Overridepublic void onNaviTurnClick() {}@Overridepublic void onNextRoadClick() {}@Overridepublic void onScanViewButtonClick() {}@Deprecated@Overridepublic void onNaviInfoUpdated(AMapNaviInfo naviInfo) {}@Overridepublic void onNaviInfoUpdate(NaviInfo naviinfo) {}@Overridepublic void OnUpdateTrafficFacility(TrafficFacilityInfo trafficFacilityInfo) {}@Overridepublic void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo aMapNaviTrafficFacilityInfo) {}@Overridepublic void showCross(AMapNaviCross aMapNaviCross) {}@Overridepublic void hideCross() {}@Overridepublic void showLaneInfo(AMapLaneInfo[] laneInfos, byte[] laneBackgroundInfo, byte[] laneRecommendedInfo) {}@Overridepublic void hideLaneInfo() {}@Overridepublic void onCalculateMultipleRoutesSuccess(int[] ints) {}@Overridepublic void notifyParallelRoad(int i) {}@Overridepublic void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo[] aMapNaviTrafficFacilityInfos) {}@Overridepublic void updateAimlessModeStatistics(AimLessModeStat aimLessModeStat) {}@Overridepublic void updateAimlessModeCongestionInfo(AimLessModeCongestionInfo aimLessModeCongestionInfo) {}@Overridepublic void onLockMap(boolean isLock) {}@Overridepublic void onNaviViewLoaded() {}@Overridepublic boolean onNaviBackClick() {return false;}}

5)语音播报组件,该组件需要在讯飞官网中注册并使用

public class TTSController implements AMapNaviListener {private Context mContext;private static TTSController ttsManager;private SpeechSynthesizer mTts;/*** 初始化监听。*/private InitListener mTtsInitListener = new InitListener() {@Overridepublic void onInit(int code) {Log.d("SHIXIN", "InitListener init() code = " + code);if (code != ErrorCode.SUCCESS) {Toast.makeText(mContext, "初始化失败,错误码:" + code, Toast.LENGTH_SHORT).show();;} else {// 初始化成功,之后可以调用startSpeaking方法// 注:有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成,// 正确的做法是将onCreate中的startSpeaking调用移至这里}}};private TTSController(Context context) {mContext = context.getApplicationContext();}public static TTSController getInstance(Context context) {if (ttsManager == null) {ttsManager = new TTSController(context);}return ttsManager;}public void init() {String text = mContext.getString(R.string.app_id);if ("586f43ad".equals(text)) {throw new IllegalArgumentException("你不应该用Demo中默认KEY,去讯飞官网申请吧!");}text="586f43ad";SpeechUtility.createUtility(mContext, "appid=" + text);// 初始化合成对象.mTts = SpeechSynthesizer.createSynthesizer(mContext, mTtsInitListener);initSpeechSynthesizer();}/*** 使用SpeechSynthesizer合成语音,不弹出合成Dialog.** @param*/public void startSpeaking(String playText) {// 进行语音合成.if (mTts != null)mTts.startSpeaking(playText, new SynthesizerListener() {@Overridepublic void onSpeakResumed() {// TODO Auto-generated method stub}@Overridepublic void onSpeakProgress(int arg0, int arg1, int arg2) {// TODO Auto-generated method stub}@Overridepublic void onSpeakPaused() {// TODO Auto-generated method stub}@Overridepublic void onSpeakBegin() {// TODO Auto-generated method stub}@Overridepublic void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {// TODO Auto-generated method stub}@Overridepublic void onCompleted(SpeechError arg0) {// TODO Auto-generated method stub}@Overridepublic void onBufferProgress(int arg0, int arg1, int arg2, String arg3) {// TODO Auto-generated method stub}});}public void stopSpeaking() {if (mTts != null)mTts.stopSpeaking();}private void initSpeechSynthesizer() {// 清空参数mTts.setParameter(SpeechConstant.PARAMS, null);mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);// 设置在线合成发音人mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaofeng");//设置合成语速mTts.setParameter(SpeechConstant.SPEED, "50");//设置合成音调mTts.setParameter(SpeechConstant.PITCH, "50");//设置合成音量mTts.setParameter(SpeechConstant.VOLUME, "50");//设置播放器音频流类型mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");// 设置播放合成音频打断音乐播放,默认为truemTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限// 注:AUDIO_FORMAT参数语记需要更新版本才能生效mTts.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/tts.wav");}public void destroy() {if (mTts != null) {mTts.stopSpeaking();mTts.destroy();ttsManager=null;}}@Overridepublic void onInitNaviFailure() {}@Overridepublic void onInitNaviSuccess() {}@Overridepublic void onStartNavi(int i) {}@Overridepublic void onTrafficStatusUpdate() {}@Overridepublic void onLocationChange(AMapNaviLocation aMapNaviLocation) {}@Overridepublic void onGetNavigationText(int i, String s) {startSpeaking(s);}@Overridepublic void onEndEmulatorNavi() {}@Overridepublic void onArriveDestination() {}@Overridepublic void onArriveDestination(NaviStaticInfo naviStaticInfo) {}@Overridepublic void onArriveDestination(AMapNaviStaticInfo aMapNaviStaticInfo) {}@Overridepublic void onCalculateRouteSuccess() {}@Overridepublic void onCalculateRouteFailure(int i) {}@Overridepublic void onReCalculateRouteForYaw() {}@Overridepublic void onReCalculateRouteForTrafficJam() {}@Overridepublic void onArrivedWayPoint(int i) {}@Overridepublic void onGpsOpenStatus(boolean b) {}@Overridepublic void onNaviInfoUpdated(AMapNaviInfo aMapNaviInfo) {}@Overridepublic void onNaviInfoUpdate(NaviInfo naviInfo) {}@Overridepublic void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo aMapNaviTrafficFacilityInfo) {}@Overridepublic void OnUpdateTrafficFacility(TrafficFacilityInfo trafficFacilityInfo) {}@Overridepublic void showCross(AMapNaviCross aMapNaviCross) {}@Overridepublic void hideCross() {}@Overridepublic void showLaneInfo(AMapLaneInfo[] aMapLaneInfos, byte[] bytes, byte[] bytes1) {}@Overridepublic void hideLaneInfo() {}@Overridepublic void onCalculateMultipleRoutesSuccess(int[] ints) {}@Overridepublic void notifyParallelRoad(int i) {}@Overridepublic void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo[] aMapNaviTrafficFacilityInfos) {}@Overridepublic void updateAimlessModeStatistics(AimLessModeStat aimLessModeStat) {}@Overridepublic void updateAimlessModeCongestionInfo(AimLessModeCongestionInfo aimLessModeCongestionInfo) {}
}

源码地址:

https://download.csdn.net/download/wk_beicai/11457079

完美简单的集成高德地图导航和语音播报功能相关推荐

  1. Vue中集成高德地图API实现定位与自定义样式信息窗体

    场景 若依前后端分离版手把手教你本地搭建环境并运行项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662 在上面 ...

  2. Android一步一步教你集成高德地图

    转载请注明出处:http://blog.csdn.net/alpha58/article/details/56488734 前言 当项目中需要使用地图SDK的时候, 是选择高德地图还是百度地图呢?从对 ...

  3. flutter集成高德地图获取位置

    flutter集成高德地图获取位置 准备工作 在创建安卓应用 获取SHA1 获取当前位置 添加依赖 文件配置 build.gradle文件配置 AndroidManifest.xml配置 获取定位 准 ...

  4. react-native调起第三方高德地图导航URL解释

    react-native调起第三方高德地图导航URL解释 做react-native地图应用时,主要使用的是高德地图,所以在导航上也准备调起高德地图应用来完成导航功能,在高德地图API官网并没有发现高 ...

  5. android-4集成高德地图的搜索和导航功能

    1.准备工作 1.1在高德地图导航包中用到的语音库为科大讯飞的,要使用的话也要在科大讯飞的开源平台上注册一个个人使用者key 1.2在使用高德地图的lib库时,最好使用导航和地图的合成库,如果导航库和 ...

  6. Anuglar8集成高德地图

    Anuglar8集成高德地图 @我是一只小菜鸡传送门 Anuglar8集成高德地图github源码 一.自己新建一个angualr项目.emm-新建项目就不用教了吧. TODO- 二.开始搞事情吧 新 ...

  7. Android中集成高德地图SDK实现地图定位和导航功能(二)

    我们接着上一篇文章开始继续实现android中集成高德地图的SDK实现地图 定位,搜索,导航的功能 如何让地图在手机上实现呢? 1.配置AndroidManifest 中的权限申请 可以参考官方文档 ...

  8. Android 起调第三方导航,百度地图,高德地图,腾讯地图。起调高德地图导航

    主要工具类 /*** Created by meixi on 2018/6/29.* 使用第三方导航:高德.百度..........*/ public class AmapUtil {public s ...

  9. 【QA】集成高德地图SDK闪退问题

    集成高德地图SDK闪退问题 昨天集成高德地图SDK,地图显示正常,但是点击返回键退出地图的时候,程序闪退,排查发现销毁地图时调用,mapView.onDestroy() 闪退,不调用的话内存溢出,这. ...

  10. Android 集成高德地图

    需要完成效果:集成高德地图,实现定位功能,并且实时刷新位置,每25秒自动刷新位置. 布局: <?xml version="1.0" encoding="utf-8& ...

最新文章

  1. Please ensure JDK installation is valid and compatible with the current OS
  2. 客户资产管理(Custom Asset Management)
  3. 社区论坛行业搜索最佳实践
  4. java注册是什么意思_springcloud注册中心是什么意思?有什么作用?
  5. UML:图的分类及作用(共5类图,有9种图形)
  6. linux轻量级的图形库,基于Microwindows的嵌入式Linux轻量级图形应用库的设计
  7. 一图精通python3
  8. 进程调度时间片轮转c语言,时间片轮转调度算法的C语言模拟实现
  9. 全球与中国激光共焦扫描显微镜市场深度研究分析报告
  10. matlab中的kron函数
  11. html设置首页到尾页的按钮,AspNetPager里面的按钮(如:首页,上一页 下一页,尾页)如何更换为我想要的图片...
  12. html在ie浏览器中中文为什么是乱码
  13. 1407 排名靠前的旅行者
  14. 苹果手机软件升级密码_秘乐魔方苹果手机下载教程
  15. [转]无需看到你的脸就能认出你——实现Beyond Frontal Faces: Improving Person Recognition Using Multiple Cues...
  16. 软件测评师--第18小时 白盒测试
  17. HTML日志查看器,如何在网页实时查看APP日志
  18. 高性能PHP应用开发-总结
  19. 中软融鑫 java笔试题_中软国际java笔试题
  20. 在微信公众号里的web商城嵌入客服_微信公众号客服功能如何在手机上使用?

热门文章

  1. Nodejs http request 报错 “ETIMEDOUT“,“ECONNRESET“ , “ENOTFOUND“,“ECONNREFUSED”,“EHOSTUNREACH“
  2. mysql etimedout_ETIMEDOUT
  3. ERROR:connect ETIMEDOUT
  4. hd6630m可以玩lol吗_《LOL》流畅玩!Intel HD620核显性能实测
  5. Word 2016封面不显示页码
  6. 电脑位数(32位或者64位)问题导致eclipse不能正常启动
  7. Beaver‘s triple(乘法三元组)-秘密共享的乘法计算
  8. 我与“萝卜坑”的点点滴滴
  9. IBM InfoSphere Optim数据增长解决方案:在Optim归档文件上启用安全性
  10. 单击选定单元格后输入新内容_excel表格,要双击选定后才能输入,单击不能输入为什么...