高德地圖導航
出發地——目的地
<?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) {
}
}