高的地图之导航:

在移动互联飞速发展的今天!O2O的崛起,许多应用都离不开可导航功能!经过几天的学习,今天把所学所想些一下。以供分享:
高德地图的基本配置请看我的第一篇博客,百度地图之定位
这里写图片描述

1.首先下载高德提供的SDK

  • AMapNavi_1.9.4_20161201.jar 导航SDK
  • AMap_Search_V3.2.1_20160308.jar
  • Msc.jar 讯飞语音合成jar包

2.语音合成工具代码:

注意在使用讯飞语音时,需要申请key:

package com.pansoft.oilgas.gaodenavigation;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import com.amap.api.navi.AMapNaviListener;
import com.amap.api.navi.model.AMapLaneInfo;
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.AMapNaviTrafficFacilityInfo;
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 com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SynthesizerListener;
/**
* 语音播报组件
*/
public class TTSController implements SynthesizerListener, AMapNaviListener {
public static final String TAG = TTSController.class.getSimpleName();
public static TTSController ttsManager;
boolean isfinish = true;
private Context mContext;
// 合成对象.
private SpeechSynthesizer mSpeechSynthesizer;
@Override
public void onEvent(int i, int i1, int i2, Bundle bundle) {
}
TTSController(Context context) {
mContext = context;
}
public static TTSController getInstance(Context context) {
if (ttsManager == null) {
ttsManager = new TTSController(context);
}
return ttsManager;
}
public void init() {
// 初始化合成对象.
// “appid=” + “586f93a2”,讯飞语音的key:
SpeechUser.getUser().login(mContext, null, null, “appid=” + “586f93a2”,
listener);
mSpeechSynthesizer = SpeechSynthesizer.createSynthesizer(mContext, null);
initSpeechSynthesizer();
}
public void playText(String playText) {
}
if (null == mSpeechSynthesizer) {
APPUtil.appendLog(mContext, “mSpeechSynthesizer is null”);
// 创建合成对象.
mSpeechSynthesizer = SpeechSynthesizer.createSynthesizer(mContext, null);
initSpeechSynthesizer();
}
// 进行语音合成.
mSpeechSynthesizer.startSpeaking(playText, this);

}

public void stopSpeaking() {
    if (mSpeechSynthesizer != null)
        mSpeechSynthesizer.stopSpeaking();
}

public void startSpeaking() {
    isfinish = true;
}
private void initSpeechSynthesizer() {
    // 设置发音人
    mSpeechSynthesizer.setParameter(SpeechConstant.VOICE_NAME,
            mContext.getString(R.string.preference_default_tts_role));
    // 设置语速
    mSpeechSynthesizer.setParameter(SpeechConstant.SPEED,
            "" + mContext.getString(R.string.preference_key_tts_speed));
    // 设置音量
    mSpeechSynthesizer.setParameter(SpeechConstant.VOLUME,
            "" + mContext.getString(R.string.preference_key_tts_volume));
    // 设置语调
    mSpeechSynthesizer.setParameter(SpeechConstant.PITCH,
            "" + mContext.getString(R.string.preference_key_tts_pitch));

}

@Override
public void onBufferProgress(int arg0, int arg1, int arg2, String arg3) {
    Log.d(TAG, "onBufferProgress");

}

@Override
public void onCompleted(SpeechError arg0) {
    APPUtil.appendLog(mContext, "error info :" + arg0.getErrorDescription());

    Log.e(TAG, arg0.getErrorDescription());
    Log.d(TAG, "onCompleted");
    isfinish = true;
}

@Override
public void onSpeakBegin() {
    APPUtil.appendLog(mContext, "onSpeakBegin");

    Log.d(TAG, "onSpeakBegin");
    isfinish = false;

}

@Override
public void onSpeakPaused() {
    APPUtil.appendLog(mContext, "onSpeakPaused");

    Log.d(TAG, "onSpeakPaused");

}

@Override
public void onSpeakProgress(int arg0, int arg1, int arg2) {
    APPUtil.appendLog(mContext, "onSpeakProgress    :" + arg0);

}

@Override
public void onSpeakResumed() {
    APPUtil.appendLog(mContext, "onSpeakResumed ");

}

public void destroy() {
    if (mSpeechSynthesizer != null) {
        mSpeechSynthesizer.stopSpeaking();
    }
}

@Override
public void onArriveDestination() {
    // TODO Auto-generated method stub
    this.playText("到达目的地");
}

@Override
public void onArrivedWayPoint(int arg0) {
    // TODO Auto-generated method stub
}

@Override
public void onCalculateRouteFailure(int arg0) {
    this.playText("路径计算失败,请检查网络或输入参数");
}

@Override
public void onCalculateRouteSuccess() {
    String calculateResult = "路径计算就绪";

    this.playText(calculateResult);
}

@Override
public void onEndEmulatorNavi() {
    this.playText("导航结束");

}

@Override
public void onGetNavigationText(int arg0, String arg1) {
    // TODO Auto-generated method stub
    this.playText(arg1);
}

@Override
public void onInitNaviFailure() {
    // TODO Auto-generated method stub

}

@Override
public void onInitNaviSuccess() {
    // TODO Auto-generated method stub

}

@Override
public void onLocationChange(AMapNaviLocation arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onReCalculateRouteForTrafficJam() {
    // TODO Auto-generated method stub
    this.playText("前方路线拥堵,路线重新规划");
}

@Override
public void onReCalculateRouteForYaw() {

    this.playText("您已偏航");
}

@Override
public void onStartNavi(int arg0) {
    // TODO Auto-generated method stub

}
@Override
public void onTrafficStatusUpdate() {
    // TODO Auto-generated method stub
}
@Override
public void onGpsOpenStatus(boolean arg0) {
    // TODO Auto-generated method stub
}
@Override
public void onNaviInfoUpdated(AMapNaviInfo arg0) {
    // TODO Auto-generated method stub

}
@Override
public void onNaviInfoUpdate(NaviInfo arg0) {

   // TODO Auto-generated method stub

}

@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[] aMapLaneInfos, byte[] bytes, byte[] bytes1) {

}

@Override
public void hideLaneInfo() {
}

@Override
public void onCalculateMultipleRoutesSuccess(int[] ints) {

}
@Override
public void notifyParallelRoad(int i) {

}

@Override
public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo[] aMapNaviTrafficFacilityInfos) {

}

@Override
public void updateAimlessModeStatistics(AimLessModeStat aimLessModeStat) {
}
@Override
public void updateAimlessModeCongestionInfo(AimLessModeCongestionInfo aimLessModeCongestionInfo) {
}}

3.在Applcation中初始化语音组建:

TTSController ttsManager = TTSController.getInstance(this);// 初始化语音模块
ttsManager.init();
initNet();
AMapNavi.getInstance(this).setAMapNaviListener(ttsManager);// 设置语音模块播报

4.获取当前位置的经纬度:

// 获取到当前位置
protected void initLocation() {
// TODO Auto-generated method stub
if (locationClient == null) {
locationClient = new AMapLocationClient(this);
// 初始化定位参数
locationClientOption = new AMapLocationClientOption();
// 设置定位监听
locationClient.setLocationListener(this);
// 设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
locationClientOption
.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
locationClientOption.setOnceLocation(true);// 設置只定位一次
// 设置定位间隔,单位毫秒,默认为2000ms
locationClientOption.setInterval(-1);
// 设置定位参数
locationClient.setLocationOption(locationClientOption);
}
locationClient.startLocation();
}

@Override
public void onLocationChanged(AMapLocation location ) {
if (location != null) {
if (location.getErrorCode() == 0) {
// if (isFirst) {
// isFirst = false;
// 获取经纬度
latitude = location.getLatitude();
longitude = location.getLongitude();
getLatlon(“河南省周口市淮阳县”, “淮阳县”);
// }
}
}
}

4.获取目的地的经纬度:

地理反编码:

public void getLatlon(final String name, final String city) {
GeocodeQuery query = new GeocodeQuery(name, city);// 第一个参数表示地址,第二个参数表示查询城市,中文或者中文全拼,citycode、adcode,
geocoderSearch.getFromLocationNameAsyn(query);// 设置同步地理编码请求
}
@Override
//得到目的地的经纬度跳转到导航界面:
public void onGeocodeSearched(GeocodeResult result, int rCode) {
// TODO Auto-generated method stub
if (rCode == 1000) {
if (result != null && result.getGeocodeAddressList() != null
&& result.getGeocodeAddressList().size() > 0) {
GeocodeAddress address = result.getGeocodeAddressList().get(0);
double endLatitude = address.getLatLonPoint().getLatitude();
double endLongitude = address.getLatLonPoint().getLongitude();
Intent dh_Intent = new Intent(MyGuite.this,
SimpleNaviActivity.class);
dh_Intent.putExtra(“latitude”, latitude);
dh_Intent.putExtra(“longitude”, longitude);
dh_Intent.putExtra(“naviMethod”, 0);
dh_Intent.putExtra(“endLatitude”, endLatitude);
dh_Intent.putExtra(“endLongitude”, endLongitude);
startActivity(dh_Intent);
} else {
Toast.makeText(MyGuite.this, “对不起,没有搜索到相关数据!”, Toast.LENGTH_SHORT)
.show();
}
} else {
Toast.makeText(MyGuite.this, rCode, Toast.LENGTH_SHORT).show();
}
}

5.获取成功跳转页面

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.map);
//得到经纬度:和行走方式
naviMethod = getIntent().getIntExtra(“naviMethod”, -1);
latitude = getIntent().getDoubleExtra(“latitude”, 0.00);
longitude = getIntent().getDoubleExtra(“longitude”, 0.00);
endLatitude = getIntent().getDoubleExtra(“endLatitude”, 0.00);
endLongitude = getIntent().getDoubleExtra(“endLongitude”, 0.00);
mAMapNaviView = (AMapNaviView) findViewById(R.id.navi_view);
mAMapNaviView.onCreate(savedInstanceState);
mEndLatlng = new NaviLatLng(endLatitude, endLongitude);
mStartLatlng = new NaviLatLng(latitude, longitude);
mStartList.add(mStartLatlng);
mEndList.add(mEndLatlng);
mTtsManager = TTSController.getInstance(getApplicationContext());
mTtsManager.init();
mTtsManager.startSpeaking();
mAMapNavi = AMapNavi.getInstance(getApplicationContext());
mAMapNavi.addAMapNaviListener(this);
mAMapNavi.addAMapNaviListener(mTtsManager);
if (naviMethod == 0) {//驾车
规划路线:
mAMapNavi.calculateDriveRoute(mStartList,mEndList,mWayPointList,PathPlanningStrategy.DRIVING_DEFAULT);
}else {
mAMapNavi.calculateWalkRoute(mStartLatlng, mEndLatlng);
}
isGps = getIntent().getBooleanExtra(“gps”, false);
}

@Override
protected void onPause() {
    super.onPause();
    //停止导航之后,会触及底层stop,然后就不会再有回调了,但是讯飞当前还是没有说完的半句话还是会说完
    mAMapNaviView.onPause();
    mAMapNavi.stopNavi();
    mTtsManager.stopSpeaking();
     mAMapNavi.stopNavi();
}

这样一个完整的导航就可以了:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值