(七)高德地圖之路線導航

本節將要實現的功能是路線導航,確定出發點和到達的終點座標,兩點之間的路線導航。跟前幾篇一樣,上代碼

首先是類文件NaviActivity.java

package com.junto.gdmaptest.navi;

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.Window;
import android.widget.Toast;

import com.amap.api.navi.AMapNavi;
import com.amap.api.navi.AMapNaviListener;
import com.amap.api.navi.AMapNaviView;
import com.amap.api.navi.AMapNaviViewListener;
import com.amap.api.navi.enums.NaviType;
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.amap.api.navi.model.NaviLatLng;
import com.autonavi.tbt.TrafficFacilityInfo;
import com.junto.gdmaptest.R;
import com.junto.gdmaptest.util.ErrorInfo;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by WangJinyong on 2018/11/7.
 * 路線導航
 */

public class NaviActivity extends Activity implements AMapNaviListener,AMapNaviViewListener {

    protected AMapNaviView mAMapNaviView;
    protected AMapNavi mAMapNavi;
    protected NaviLatLng mEndLatlng = new NaviLatLng(40.084894,116.603039);//終點經緯度
    protected NaviLatLng mStartLatlng = new NaviLatLng(39.825934,116.342972);//起點經緯度
    protected final List<NaviLatLng> sList = new ArrayList<NaviLatLng>();//起點經緯度集合
    protected final List<NaviLatLng> eList = new ArrayList<NaviLatLng>();//終點經緯度集合
    protected List<NaviLatLng> mWayPointList;//途經點經緯度集合

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_navi);
        mAMapNaviView = findViewById(R.id.navi_view);
        mAMapNaviView.onCreate(savedInstanceState);
        mAMapNaviView.setAMapNaviViewListener(this);
        mAMapNavi = AMapNavi.getInstance(getApplicationContext());
        mAMapNavi.addAMapNaviListener(this);
        mAMapNavi.setUseInnerVoice(true);//使用內置語音播報

        //設置模擬導航的行車速度
        mAMapNavi.setEmulatorNaviSpeed(75);
        sList.add(mStartLatlng);
        eList.add(mEndLatlng);
        mWayPointList = new ArrayList();
        mWayPointList.add(new NaviLatLng(39.925846, 116.442765));
    }

    @Override
    protected void onResume() {
        super.onResume();
        mAMapNaviView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mAMapNaviView.onPause();
//        停止導航之後,會觸及底層stop,然後就不會再有回調了,但是訊飛當前還是沒有說完的半句話還是會說完
//        mAMapNavi.stopNavi();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mAMapNaviView.onDestroy();
        //since 1.6.0 不再在naviview destroy的時候自動執行AMapNavi.stopNavi();請自行執行
        mAMapNavi.stopNavi();
        mAMapNavi.destroy();
    }

    //==============================下面是AMapNaviListener實現的方法=========================//
    @Override
    public void onInitNaviFailure() {

    }

    @Override
    public void onInitNaviSuccess() {
        //初始化成功
        /**
         * 方法: int strategy=mAMapNavi.strategyConvert(congestion, avoidhightspeed, cost, hightspeed, multipleroute); 參數:
         *
         * @congestion 躲避擁堵
         * @avoidhightspeed 不走高速
         * @cost 避免收費
         * @hightspeed 高速優先
         * @multipleroute 多路徑
         *
         *  說明: 以上參數都是boolean類型,其中multipleroute參數表示是否多條路線,如果爲true則此策略會算出多條路線。
         *  注意: 不走高速與高速優先不能同時爲true 高速優先與避免收費不能同時爲true
         */
        int strategy = 0;
        try {
            //再次強調,最後一個參數爲true時代表多路徑,否則代表單路徑
            strategy = mAMapNavi.strategyConvert(true, true, true, false, true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        mAMapNavi.calculateDriveRoute(sList, eList, mWayPointList, strategy);//起始點座標、終點座標、途經點座標、strategy
//        mAMapNavi.calculateWalkRoute(new NaviLatLng(39.925846, 116.435765), new NaviLatLng(39.925846, 116.532765));//步行導航
//        mAMapNavi.calculateRideRoute(new NaviLatLng(39.925846, 116.435765), new NaviLatLng(39.925846, 116.532765));//騎行導航
    }

    @Override
    public void onCalculateRouteSuccess(int[] ints) {
        //多路徑算路成功回調
//        mAMapNavi.startNavi(NaviType.EMULATOR);//模擬導航
        mAMapNavi.startNavi(NaviType.GPS);//實時導航
    }

    @Override
    public void onStartNavi(int i) {
        //開始導航回調
    }

    @Override
    public void onTrafficStatusUpdate() {

    }

    @Override
    public void onLocationChange(AMapNaviLocation aMapNaviLocation) {
        //當前位置回調
    }

    @Override
    public void onGetNavigationText(int i, String s) {
        //播報類型和播報文字回調
    }

    @Override
    public void onGetNavigationText(String s) {

    }

    @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 i) {
        //到達途徑點
    }

    @Override
    public void onGpsOpenStatus(boolean b) {
        //GPS開關狀態回調
    }

    @Override
    public void onNaviInfoUpdate(NaviInfo naviInfo) {
        //導航過程中的信息更新,請看NaviInfo的具體說明
    }

    @Override
    public void onNaviInfoUpdated(AMapNaviInfo aMapNaviInfo) {
        //過時
    }

    @Override
    public void updateCameraInfo(AMapNaviCameraInfo[] aMapNaviCameraInfos) {

    }

    @Override
    public void updateIntervalCameraInfo(AMapNaviCameraInfo aMapNaviCameraInfo, AMapNaviCameraInfo aMapNaviCameraInfo1, int i) {

    }

    @Override
    public void onServiceAreaUpdate(AMapServiceAreaInfo[] aMapServiceAreaInfos) {

    }

    @Override
    public void showCross(AMapNaviCross aMapNaviCross) {
        //顯示轉彎回調
    }

    @Override
    public void hideCross() {
        //隱藏轉彎回調
    }

    @Override
    public void showModeCross(AMapModelCross aMapModelCross) {

    }

    @Override
    public void hideModeCross() {

    }

    @Override
    public void showLaneInfo(AMapLaneInfo[] aMapLaneInfos, byte[] bytes, byte[] bytes1) {

    }

    @Override
    public void showLaneInfo(AMapLaneInfo aMapLaneInfo) {
        //顯示車道信息
    }

    @Override
    public void hideLaneInfo() {
        //隱藏車道信息
    }

    @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 aMapNaviTrafficFacilityInfo) {
        //已過時
    }

    @Override
    public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo[] aMapNaviTrafficFacilityInfos) {
        //更新交通設施信息
    }

    @Override
    public void OnUpdateTrafficFacility(TrafficFacilityInfo trafficFacilityInfo) {
        //已過時
    }

    @Override
    public void updateAimlessModeStatistics(AimLessModeStat aimLessModeStat) {
        //更新巡航模式的統計信息
    }

    @Override
    public void updateAimlessModeCongestionInfo(AimLessModeCongestionInfo aimLessModeCongestionInfo) {
        //更新巡航模式的擁堵信息
    }

    @Override
    public void onPlayRing(int i) {

    }

    @Override
    public void onCalculateRouteSuccess(AMapCalcRouteResult aMapCalcRouteResult) {

    }

    @Override
    public void onCalculateRouteFailure(AMapCalcRouteResult aMapCalcRouteResult) {

    }

    @Override
    public void onNaviRouteNotify(AMapNaviRouteNotifyData aMapNaviRouteNotifyData) {

    }

    //============================下面是AMapNaviViewListener實現的方法==================================//
    @Override
    public void onNaviSetting() {
        //底部導航設置點擊回調
    }

    @Override
    public void onNaviCancel() {
        finish();
    }

    @Override
    public boolean onNaviBackClick() {
        return false;
    }

    @Override
    public void onNaviMapMode(int i) {
        //地圖的模式,鎖屏或鎖車
    }

    @Override
    public void onNaviTurnClick() {
        //轉彎view的點擊回調
    }

    @Override
    public void onNextRoadClick() {
        //下一個道路View點擊回調
    }

    @Override
    public void onScanViewButtonClick() {
        //全覽按鈕點擊回調
    }

    @Override
    public void onLockMap(boolean b) {
        //鎖地圖狀態發生變化時回調
    }

    @Override
    public void onNaviViewLoaded() {
        Log.d("wlx", "導航頁面加載成功");
        Log.d("wlx", "請不要使用AMapNaviView.getMap().setOnMapLoadedListener();會overwrite導航SDK內部畫線邏輯");
    }

    @Override
    public void onMapTypeChanged(int i) {

    }

    @Override
    public void onNaviViewShowMode(int i) {

    }
}

然後是佈局文件activity_navi.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.amap.api.navi.AMapNaviView
        android:id="@+id/navi_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"/>
</LinearLayout>

其中有實時導航和模擬導航

@Override
    public void onCalculateRouteSuccess(int[] ints) {
        //多路徑算路成功回調
//        mAMapNavi.startNavi(NaviType.EMULATOR);//模擬導航
        mAMapNavi.startNavi(NaviType.GPS);//實時導航
    }

步行導航和騎行導航與駕車導航就更改一句話就可以了

@Override
    public void onInitNaviSuccess() {
        //初始化成功
        /**
         * 方法: int strategy=mAMapNavi.strategyConvert(congestion, avoidhightspeed, cost, hightspeed, multipleroute); 參數:
         *
         * @congestion 躲避擁堵
         * @avoidhightspeed 不走高速
         * @cost 避免收費
         * @hightspeed 高速優先
         * @multipleroute 多路徑
         *
         *  說明: 以上參數都是boolean類型,其中multipleroute參數表示是否多條路線,如果爲true則此策略會算出多條路線。
         *  注意: 不走高速與高速優先不能同時爲true 高速優先與避免收費不能同時爲true
         */
        int strategy = 0;
        try {
            //再次強調,最後一個參數爲true時代表多路徑,否則代表單路徑
            strategy = mAMapNavi.strategyConvert(true, true, true, false, true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        mAMapNavi.calculateDriveRoute(sList, eList, mWayPointList, strategy);//起始點座標、終點座標、途經點座標、strategy
//        mAMapNavi.calculateWalkRoute(new NaviLatLng(39.925846, 116.435765), new NaviLatLng(39.925846, 116.532765));//步行導航
//        mAMapNavi.calculateRideRoute(new NaviLatLng(39.925846, 116.435765), new NaviLatLng(39.925846, 116.532765));//騎行導航
    }

以上就實現了路線導航功能,實際開發我們需要根據實際需求來更改

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章