高德地圖導航

高德地圖導航


出發地——目的地

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

    <EditText
        android:id="@+id/et_start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="起始地" />

    <EditText
        android:id="@+id/et_end"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="目的地" />

    <Button
        android:id="@+id/btn_navi"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="開始導航" />
</LinearLayout>

java

package com.example.map;

import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import androidx.appcompat.app.AppCompatActivity;

import com.amap.api.services.core.PoiItem;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;

import java.util.ArrayList;

public class Main3Activity extends AppCompatActivity {
    private EditText etStart;
    private EditText etEnd;
    private Button btnNavi;
    private double start_la,start_lng,end_la,end_lng;//起始點,目的地座標


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
        initView();
    }

    private void initView() {
        etStart = (EditText) findViewById(R.id.et_start);
        etEnd = (EditText) findViewById(R.id.et_end);
        btnNavi = (Button) findViewById(R.id.btn_navi);

        btnNavi.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!etStart.getText().toString().trim().equals("")&&!etEnd.getText().toString().trim().equals("")){
                    Intent intent = new Intent(Main3Activity.this,Main2Activity.class);
                    intent.putExtra("start_la",start_la);
                    intent.putExtra("start_lng",start_lng);
                    intent.putExtra("end_la",end_la);
                    intent.putExtra("end_lng",end_lng);
                    startActivity(intent);
                }
            }
        });

        etStart.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                //起始位置
                start();
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //起始位置
                start();
            }

            @Override
            public void afterTextChanged(Editable s) {
                //起始位置
                start();
            }
        });

        etEnd.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                //結束位置
                end();
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //結束位置
                end();
            }

            @Override
            public void afterTextChanged(Editable s) {
                //結束位置
                end();
            }
        });

    }

    private void end() {
        final String end = etEnd.getText().toString().trim();
        PoiSearch.Query  query = new PoiSearch.Query(end, "", "");
//keyWord表示搜索字符串,
//第二個參數表示POI搜索類型,二者選填其一,選用POI搜索類型時建議填寫類型代碼,碼錶可以參考下方(而非文字)
//cityCode表示POI搜索區域,可以是城市編碼也可以是城市名稱,也可以傳空字符串,空字符串代表全國在全國範圍內進行搜索
        query.setPageSize(10);// 設置每頁最多返回多少條poiitem
        query.setPageNum(1);//設置查詢頁碼
        PoiSearch poiSearch = new PoiSearch(this, query);
        poiSearch.setOnPoiSearchListener(new PoiSearch.OnPoiSearchListener() {
            @Override
            public void onPoiSearched(PoiResult poiResult, int i) {
                if(poiResult != null && i ==1000){
                    ArrayList<PoiItem> pois = poiResult.getPois();
                    if(pois.size()>0){
                        end_la = pois.get(0).getLatLonPoint().getLatitude();
                        end_lng = pois.get(0).getLatLonPoint().getLongitude();

                        Log.d("---", "end:"+end_la+"---"+end_lng);
                    }
                }
            }

            @Override
            public void onPoiItemSearched(PoiItem poiItem, int i) {

            }
        });
        poiSearch.searchPOIAsyn();
    }

    private void start() {
        String start = etStart.getText().toString().trim();
        PoiSearch.Query query = new PoiSearch.Query(start, "", "");
        query.setPageSize(10);// 設置每頁最多返回多少條poiitem
        query.setPageNum(1);//設置查詢頁碼
        PoiSearch poiSearch = new PoiSearch(this, query);
        poiSearch.setOnPoiSearchListener(new PoiSearch.OnPoiSearchListener() {
            @Override
            public void onPoiSearched(PoiResult poiResult, int i) {
                if(poiResult != null && i ==1000){
                    ArrayList<PoiItem> pois = poiResult.getPois();
                    if(pois.size()>0){
                        start_la = pois.get(0).getLatLonPoint().getLatitude();
                        start_lng = pois.get(0).getLatLonPoint().getLongitude();
                        Log.d("---", "start:"+start_la+"---"+start_lng);
                    }
                }
            }

            @Override
            public void onPoiItemSearched(PoiItem poiItem, int i) {

            }
        });
        poiSearch.searchPOIAsyn();
    }
}

導航界面

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

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

java

package com.example.map;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

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 java.util.ArrayList;
import java.util.List;

public class Main2Activity extends AppCompatActivity implements AMapNaviViewListener, AMapNaviListener {
    private AMapNaviView naviView;
    private AMapNavi mAMapNavi;
    private List<NaviLatLng> sList = new ArrayList<>();//起始經緯度
    private List<NaviLatLng> eList = new ArrayList<>();//結束經緯度
    private double start_la,start_lng,end_la,end_lng;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        //TODO 0:起點和終點
        start_la = getIntent().getDoubleExtra("start_la",0);
        start_lng = getIntent().getDoubleExtra("start_lng",0);
        end_la = getIntent().getDoubleExtra("end_la",0);
        end_lng = getIntent().getDoubleExtra("end_lng",0);
        sList.add(new NaviLatLng(start_la,start_lng));
        eList.add(new NaviLatLng(end_la,end_lng));
        //TODO  1:獲取 AMapNaviView 實例
        naviView = (AMapNaviView) findViewById(R.id.navi_view);
        naviView.setAMapNaviViewListener(this);//點擊導航地圖X 關閉導航
        naviView.onCreate(savedInstanceState);
        //TODO 2:獲取AMapNavi實例
        mAMapNavi = AMapNavi.getInstance(getApplicationContext());
//添加監聽回調,用於處理算路成功
        mAMapNavi.addAMapNaviListener(this);//計算路徑 開始導航
        mAMapNavi.setUseInnerVoice(true);//設置聲音
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        naviView.onDestroy();
    }

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

    @Override
    protected void onPause() {
        super.onPause();
        naviView.onPause();
    }

    @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() {

    }

    @Override
    public void onNextRoadClick() {

    }

    @Override
    public void onScanViewButtonClick() {

    }

    @Override
    public void onLockMap(boolean b) {

    }

    @Override
    public void onNaviViewLoaded() {

    }

    @Override
    public void onMapTypeChanged(int i) {

    }

    @Override
    public void onNaviViewShowMode(int i) {

    }

    @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 {
            strategy = mAMapNavi.strategyConvert(true, false, false, false, false);
        } catch (Exception e) {
            e.printStackTrace();
        }
        mAMapNavi.calculateDriveRoute(sList, eList, null, strategy);
    }

    @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 i) {

    }

    @Override
    public void onReCalculateRouteForYaw() {

    }

    @Override
    public void onReCalculateRouteForTrafficJam() {

    }

    @Override
    public void onArrivedWayPoint(int i) {

    }

    @Override
    public void onGpsOpenStatus(boolean b) {

    }

    @Override
    public void onNaviInfoUpdate(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 onCalculateRouteSuccess(int[] ints) {
        mAMapNavi.startNavi(NaviType.GPS);
    }

    @Override
    public void notifyParallelRoad(int i) {

    }

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

    }

    @Override
    public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo aMapNaviTrafficFacilityInfo) {

    }

    @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) {

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