package com.example.xiaotrip.base.gaode.gpsnav.util; import android.content.Context; import android.os.Handler; import android.os.Message; import com.amap.api.navi.AMapNaviListener; import com.amap.api.navi.model.AMapCalcRouteResult; import com.amap.api.navi.model.AMapLaneInfo; import com.amap.api.navi.model.AMapModelCross; import com.amap.api.navi.model.AMapNaviCameraInfo; import com.amap.api.navi.model.AMapNaviCross; import com.amap.api.navi.model.AMapNaviInfo; import com.amap.api.navi.model.AMapNaviLocation; import com.amap.api.navi.model.AMapNaviRouteNotifyData; import com.amap.api.navi.model.AMapNaviTrafficFacilityInfo; import com.amap.api.navi.model.AMapServiceAreaInfo; import com.amap.api.navi.model.AimLessModeCongestionInfo; import com.amap.api.navi.model.AimLessModeStat; import com.amap.api.navi.model.NaviInfo; import com.autonavi.tbt.TrafficFacilityInfo; import java.util.LinkedList; /** * 当前DEMO的播报方式是队列模式。其原理就是依次将需要播报的语音放入链表中,播报过程是从头开始依次往后播报。 *

* 导航SDK原则上是不提供语音播报模块的,如果您觉得此种播报方式不能满足你的需求,请自行优化或改进。 */ public class TTSController implements AMapNaviListener, ICallBack { @Override public void onCompleted(int code) { if (handler != null) { handler.obtainMessage(1).sendToTarget(); } } public static enum TTSType { /** * 讯飞语音 */ IFLYTTS, /** * 系统语音 */ SYSTEMTTS; } public static TTSController ttsManager; private Context mContext; private TTS tts = null; private SystemTTS systemTTS; private IFlyTTS iflyTTS = null; 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: if (tts != null && wordList.size() > 0) { tts.playText(wordList.removeFirst()); } break; case CHECK_TTS_PLAY: if (!tts.isPlaying()) { handler.obtainMessage(1).sendToTarget(); } break; default: } } }; public void setVideoText(String s){ try { tts.playText(s); }catch (Exception e){ } } public void setTTSType(TTSType type) { if (type == TTSType.SYSTEMTTS) { tts = systemTTS; } else { tts = iflyTTS; } tts.setCallback(this); } private TTSController(Context context) { mContext = context.getApplicationContext(); systemTTS = SystemTTS.getInstance(mContext); iflyTTS = IFlyTTS.getInstance(mContext); tts = iflyTTS; } public void init() { if (systemTTS != null) { systemTTS.init(); } if (iflyTTS != null) { iflyTTS.init(); } tts.setCallback(this); } public static TTSController getInstance(Context context) { if (ttsManager == null) { ttsManager = new TTSController(context); } return ttsManager; } public void stopSpeaking() { if (systemTTS != null) { systemTTS.stopSpeak(); } if (iflyTTS != null) { iflyTTS.stopSpeak(); } wordList.clear(); } public void destroy() { if (systemTTS != null) { systemTTS.destroy(); } if (iflyTTS != null) { iflyTTS.destroy(); } ttsManager = null; } /**************************************************************************** * 以下都是导航相关接口 ****************************************************************************/ @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) { } @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 updateAimlessModeStatistics(AimLessModeStat aimLessModeStat) { } @Override public void updateAimlessModeCongestionInfo(AimLessModeCongestionInfo aimLessModeCongestionInfo) { } @Override public void onPlayRing(int type) { } @Override public void onCalculateRouteSuccess(AMapCalcRouteResult aMapCalcRouteResult) { } @Override public void onCalculateRouteFailure(AMapCalcRouteResult aMapCalcRouteResult) { } @Override public void onNaviRouteNotify(AMapNaviRouteNotifyData aMapNaviRouteNotifyData) { } @Override public void onGetNavigationText(String playText) { if (wordList != null) wordList.addLast(playText); handler.obtainMessage(CHECK_TTS_PLAY).sendToTarget(); } @Override @Deprecated public void OnUpdateTrafficFacility(TrafficFacilityInfo arg0) { } @Override public void showModeCross(AMapModelCross aMapModelCross) { } @Override public void hideModeCross() { } @Override public void updateIntervalCameraInfo(AMapNaviCameraInfo aMapNaviCameraInfo, AMapNaviCameraInfo aMapNaviCameraInfo1, int i) { } @Override public void showLaneInfo(AMapLaneInfo aMapLaneInfo) { } }