Android高德地图导航or语音播报

您所在的位置:网站首页 理事怎么翻译英文 Android高德地图导航or语音播报

Android高德地图导航or语音播报

2023-06-25 12:03| 来源: 网络整理| 查看: 265

导航实现主要代码:

public class NaviBaseActivity extends Activity implements AMapNaviListener, AMapNaviViewListener { protected AMapNaviView mAMapNaviView; protected AMapNavi mAMapNavi; protected TTSController mTtsManager; protected AlertDialog.Builder builder; protected AlertDialog dialog; protected final List sList = new ArrayList(); protected final List eList = new ArrayList(); protected List mWayPointList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); //实例化语音引擎 mTtsManager = TTSController.getInstance(getApplicationContext()); mTtsManager.init(); // mAMapNavi = AMapNavi.getInstance(getApplicationContext()); mAMapNavi.addAMapNaviListener(this); mAMapNavi.addAMapNaviListener(mTtsManager); //设置模拟导航的行车速度 mAMapNavi.setEmulatorNaviSpeed(75); } @Override protected void onResume() { super.onResume(); mAMapNaviView.onResume(); } @Override protected void onPause() { dismissDialog(); super.onPause(); mAMapNaviView.onPause(); // 仅仅是停止你当前在说的这句话,一会到新的路口还是会再说的 mTtsManager.stopSpeaking(); // // 停止导航之后,会触及底层stop,然后就不会再有回调了,但是讯飞当前还是没有说完的半句话还是会说完 // mAMapNavi.stopNavi(); } @Override protected void onDestroy() { super.onDestroy(); mAMapNaviView.onDestroy(); //since 1.6.0 不再在naviview destroy的时候自动执行AMapNavi.stopNavi();请自行执行 mAMapNavi.stopNavi(); mAMapNavi.destroy(); mTtsManager.destroy(); } @Override public void onInitNaviFailure() { Toast.makeText(this, "init navi Failed", Toast.LENGTH_SHORT).show(); } @Override public void onInitNaviSuccess() { //初始化成功 } @Override public void onStartNavi(int type) { //开始导航回调 Toast.makeText(this, "开始导航", Toast.LENGTH_SHORT).show(); } @Override public void onTrafficStatusUpdate() { // } @Override public void onLocationChange(AMapNaviLocation location) { //当前位置回调 } @Override public void onGetNavigationText(int type, String text) { //播报类型和播报文字回调 } @Override public void onEndEmulatorNavi() { //结束模拟导航 } @Override public void onArriveDestination() { //到达目的地 } @Override public void onCalculateRouteFailure(int errorInfo) { //路线计算失败 Log.e("dm", "--------------------------------------------"); Log.i("dm", "路线计算失败:错误码=" + errorInfo + ",Error Message= " + ErrorInfo.getError(errorInfo)); Log.i("dm", "错误码详细链接见:http://lbs.amap.com/api/android-navi-sdk/guide/tools/errorcode/"); Log.e("dm", "--------------------------------------------"); Toast.makeText(this, "errorInfo:" + errorInfo + ",Message:" + ErrorInfo.getError(errorInfo), Toast.LENGTH_LONG).show(); } @Override public void onReCalculateRouteForYaw() { //偏航后重新计算路线回调 } @Override public void onReCalculateRouteForTrafficJam() { //拥堵后重新计算路线回调 } @Override public void onArrivedWayPoint(int wayID) { //到达途径点 } @Override public void onGpsOpenStatus(boolean enabled) { //GPS开关状态回调 } @Override public void onNaviSetting() { //底部导航设置点击回调 } @Override public void onNaviMapMode(int isLock) { //地图的模式,锁屏或锁车 } @Override public void onNaviCancel() { finish(); } @Override public void onNaviTurnClick() { //转弯view的点击回调 } @Override public void onNextRoadClick() { //下一个道路View点击回调 } @Override public void onScanViewButtonClick() { //全览按钮点击回调 } @Deprecated @Override public void onNaviInfoUpdated(AMapNaviInfo naviInfo) { //过时 } @Override public void updateCameraInfo(AMapNaviCameraInfo[] aMapCameraInfos) { } @Override public void onServiceAreaUpdate(AMapServiceAreaInfo[] amapServiceAreaInfos) { } @Override public void onNaviInfoUpdate(NaviInfo naviinfo) { //导航过程中的信息更新,请看NaviInfo的具体说明 } @Override public void OnUpdateTrafficFacility(TrafficFacilityInfo trafficFacilityInfo) { //已过时 } @Override public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo aMapNaviTrafficFacilityInfo) { //已过时 } @Override public void showCross(AMapNaviCross aMapNaviCross) { //显示转弯回调 } @Override public void hideCross() { //隐藏转弯回调 } @Override public void showLaneInfo(AMapLaneInfo[] laneInfos, byte[] laneBackgroundInfo, byte[] laneRecommendedInfo) { //显示车道信息 } @Override public void hideLaneInfo() { //隐藏车道信息 } @Override public void onCalculateRouteSuccess(int[] ints) { //多路径算路成功回调 } @Override public void notifyParallelRoad(int i) { if (i == 0) { Toast.makeText(this, "当前在主辅路过渡", Toast.LENGTH_SHORT).show(); Log.d("wlx", "当前在主辅路过渡"); return; } if (i == 1) { Toast.makeText(this, "当前在主路", Toast.LENGTH_SHORT).show(); Log.d("wlx", "当前在主路"); return; } if (i == 2) { Toast.makeText(this, "当前在辅路", Toast.LENGTH_SHORT).show(); Log.d("wlx", "当前在辅路"); } } @Override public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo[] aMapNaviTrafficFacilityInfos) { //更新交通设施信息 } @Override public void updateAimlessModeStatistics(AimLessModeStat aimLessModeStat) { //更新巡航模式的统计信息 } @Override public void updateAimlessModeCongestionInfo(AimLessModeCongestionInfo aimLessModeCongestionInfo) { //更新巡航模式的拥堵信息 } @Override public void onPlayRing(int i) { } @Override public void onLockMap(boolean isLock) { //锁地图状态发生变化时回调 } @Override public void onNaviViewLoaded() { Log.d("wlx", "导航页面加载成功"); Log.d("wlx", "请不要使用AMapNaviView.getMap().setOnMapLoadedListener();会overwrite导航SDK内部画线逻辑"); } @Override public boolean onNaviBackClick() { return false; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { showNavBackDialog(); return true; } return super.onKeyDown(keyCode, event); } /*** * 返回按钮 dialog提示 */ private void showNavBackDialog() { builder = new AlertDialog.Builder(this); builder.setTitle("提示"); builder.setMessage("确定退出导航?"); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { } }); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { finish(); } }); dialog = builder.show(); } /*** * 回收dialog */ private void dismissDialog(){ if(dialog != null){ if(dialog.isShowing()){ dialog.dismiss(); } dialog = null; } builder = null; } } 语音播报类:

public class TTSController implements AMapNaviListener { /** * 请替换您自己申请的ID。 * 57b3c4a9 * */ private final String appId = "59a3c892"; public static TTSController ttsManager; private Context mContext; private SpeechSynthesizer mTts; private boolean isPlaying = false; private LinkedList wordList = new LinkedList(); private final int TTS_PLAY = 1; private final int CHECK_TTS_PLAY = 2; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case TTS_PLAY: synchronized (mTts) { if (!isPlaying && mTts != null && wordList.size() > 0) { isPlaying = true; String playtts = wordList.removeFirst(); if (mTts == null) { createSynthesizer(); } mTts.startSpeaking(playtts, new SynthesizerListener() { @Override public void onCompleted(SpeechError arg0) { isPlaying = false; handler.obtainMessage(1).sendToTarget(); } @Override public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) { } @Override public void onBufferProgress(int arg0, int arg1, int arg2, String arg3) { // 合成进度 isPlaying = true; } @Override public void onSpeakBegin() { //开始播放 isPlaying = true; } @Override public void onSpeakPaused() { } @Override public void onSpeakProgress(int arg0, int arg1, int arg2) { //播放进度 isPlaying = true; } @Override public void onSpeakResumed() { //继续播放 isPlaying = true; } }); } } break; case CHECK_TTS_PLAY: if (!isPlaying) { handler.obtainMessage(1).sendToTarget(); } break; } } }; private TTSController(Context context) { mContext = context.getApplicationContext(); SpeechUtility.createUtility(mContext, SpeechConstant.APPID + "=" + appId); if (mTts == null) { createSynthesizer(); } } private void createSynthesizer() { mTts = SpeechSynthesizer.createSynthesizer(mContext, new InitListener() { @Override public void onInit(int errorcode) { if (ErrorCode.SUCCESS == errorcode) { } else { Toast.makeText(mContext, "语音合成初始化失败!", Toast.LENGTH_SHORT); } } }); } public void init() { //设置发音人 mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan"); //设置语速,值范围:[0, 100],默认值:50 mTts.setParameter(SpeechConstant.SPEED, "55"); //设置音量 mTts.setParameter(SpeechConstant.VOLUME, "tts_volume"); //设置语调 mTts.setParameter(SpeechConstant.PITCH, "tts_pitch"); } public static TTSController getInstance(Context context) { if (ttsManager == null) { synchronized (TTSController.class){ if(ttsManager == null){ ttsManager = new TTSController(context); } } } return ttsManager; } public void stopSpeaking() { if (wordList != null) { wordList.clear(); } if (mTts != null) { mTts.stopSpeaking(); } isPlaying = false; } public void destroy() { if (wordList != null) { wordList.clear(); } if (mTts != null) { mTts.destroy(); } } /**************************************************************************** * 以下都是导航相关接口 ****************************************************************************/ @Override public void onArriveDestination() { } @Override public void onArrivedWayPoint(int arg0) { } @Override public void onCalculateRouteFailure(int arg0) { if (wordList != null) wordList.addLast("路线规划失败"); } @Override public void onEndEmulatorNavi() { } @Override public void onGetNavigationText(int arg0, String arg1) { if (wordList != null) wordList.addLast(arg1); handler.obtainMessage(CHECK_TTS_PLAY).sendToTarget(); } @Override public void onInitNaviFailure() { } @Override public void onInitNaviSuccess() { } @Override public void onLocationChange(AMapNaviLocation arg0) { } @Override public void onReCalculateRouteForTrafficJam() { if (wordList != null) wordList.addLast("前方路线拥堵,路线重新规划"); } @Override public void onReCalculateRouteForYaw() { if (wordList != null) wordList.addLast("路线重新规划"); } @Override public void onStartNavi(int arg0) { } @Override public void onTrafficStatusUpdate() { } @Override public void onGpsOpenStatus(boolean enabled) { } @Override public void onNaviInfoUpdate(NaviInfo naviinfo) { } @Override public void onNaviInfoUpdated(AMapNaviInfo aMapNaviInfo) { } @Override public void updateCameraInfo(AMapNaviCameraInfo[] infoArray) { } @Override public void onServiceAreaUpdate(AMapServiceAreaInfo[] infoArray) { } @Override public void showCross(AMapNaviCross aMapNaviCross) { } @Override public void hideCross() { } @Override public void showLaneInfo(AMapLaneInfo[] laneInfos, byte[] laneBackgroundInfo, byte[] laneRecommendedInfo) { } @Override public void hideLaneInfo() { } @Override public void onCalculateRouteSuccess(int[] routeIds) { } @Override public void notifyParallelRoad(int parallelRoadType) { } @Override public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo aMapNaviTrafficFacilityInfo) { } @Override public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo[] infos) { } @Override public void OnUpdateTrafficFacility(TrafficFacilityInfo trafficFacilityInfo) { } @Override public void updateAimlessModeStatistics(AimLessModeStat aimLessModeStat) { } @Override public void updateAimlessModeCongestionInfo(AimLessModeCongestionInfo aimLessModeCongestionInfo) { } @Override public void onPlayRing(int type) { } }

activity :

public class GDNavigationActivity extends NaviBaseActivity{ @Override protected void onCreate( Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_gdnavigation); mAMapNaviView = (AMapNaviView) findViewById(R.id.gdn_view); mAMapNaviView.onCreate(savedInstanceState); mAMapNaviView.setAMapNaviViewListener(this); } /*** * mAMapNavi.strategyConvert(congestion, avoidhightspeed, cost, hightspeed, multipleroute); 参数: * @congestion 躲避拥堵 * @avoidhightspeed 不走高速 * @cost 避免收费 * @hightspeed 高速优先 * @multipleroute 多路径 */ @Override public void onInitNaviSuccess() { super.onInitNaviSuccess(); sList.clear(); sList.add(new NaviLatLng(31.236678,121.46584)); eList.clear(); eList.add(new NaviLatLng(31.200204,121.33324)); int strategy = 0; try { //再次强调,最后一个参数为true时代表多路径,否则代表单路径 strategy = mAMapNavi.strategyConvert(true, false, false, false, false); } catch (Exception e) { e.printStackTrace(); } mAMapNavi.setCarNumber("沪", "DF8888"); mAMapNavi.calculateDriveRoute(sList, eList, mWayPointList, strategy); } @Override public void onCalculateRouteSuccess(int[] ints) { super.onCalculateRouteSuccess(ints); mAMapNavi.startNavi(NaviType.GPS); } } 以上代码拷入工程 即可实现高德导航。权限不要忘了!!!

我不生产代码,我只是代码的搬运工。

转载请注明地址,I firmly believe that the mind is beautiful。

http://blog.csdn.net/qq_34062297/article/details/77651097



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3