首先在
注冊一個appke
在AndroidManifest里面加上權限:
<!--允許程序打開網絡套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允許程序設置內置sd卡的寫權限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允許程序獲取網絡狀態-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允許程序訪問WiFi網絡信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允許程序讀寫手機狀態和身份-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--允許程序訪問CellID或WiFi熱點來獲取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
在<application
</application>
里面加上
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="key">
//開發者申請的key
</meta-data>
例如:<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="key">
//開發者申請的key
</meta-data>
</application>
在app的 build.gradle 里面添加依賴:
compile 'com.amap.api:3dmap:latest.integration'//高德地圖——3D地圖so及包
compile 'com.amap.api:location:latest.integration' // 高德地圖 定位功能
compile 'com.amap.api:search:latest.integration' //高德地圖 搜索功能
在java源代碼里面添加兩個包
在drawable中mipmap-xxhdpi和添加路徑規划所需要的圖片
在搜索頁面:
package com.example.im.android_map2;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.geocoder.GeocodeAddress;
import com.amap.api.services.geocoder.GeocodeQuery;
import com.amap.api.services.geocoder.GeocodeResult;
import com.amap.api.services.geocoder.GeocodeSearch;
import com.amap.api.services.geocoder.RegeocodeResult;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
public class MainActivity extends AppCompatActivity {
@InjectView(R.id.start)
EditText mStart;
@InjectView(R.id.end)
EditText mEnd;
@InjectView(R.id.enter)
Button enter;
//開始位置和結束位置的字符串
private String start, end;
//查詢你自己輸入的路徑的
private GeocodeSearch searchStart;
private GeocodeSearch searchEnd;
//這兩個類是用來得到經緯度
private LatLonPoint latLonPointStart;
private LatLonPoint latLonPointEnd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
searchStart = new GeocodeSearch(this);
searchEnd = new GeocodeSearch(this);
}
@OnClick(R.id.enter)
public void onViewClicked() {
start = mStart.getText().toString();
end = mEnd.getText().toString();
if (start.isEmpty() || end.isEmpty()) {
Toast.makeText(this, "請輸入地址", Toast.LENGTH_SHORT).show();
} else {
initStart();
}
}
private void initStart() {
GeocodeQuery query = new GeocodeQuery(start, "");
//查詢你輸入的字符串
searchStart.getFromLocationNameAsyn(query);
searchStart.setOnGeocodeSearchListener(new GeocodeSearch.OnGeocodeSearchListener() {
@Override
public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {
}
@Override
public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
GeocodeAddress addr = geocodeResult.getGeocodeAddressList().get(0);
latLonPointStart = addr.getLatLonPoint();
Log.e("start", latLonPointStart.toString());
initEnd();
}
});
}
private void initEnd() {
GeocodeQuery query1 = new GeocodeQuery(end, "");
searchEnd.getFromLocationNameAsyn(query1);
searchEnd.setOnGeocodeSearchListener(new GeocodeSearch.OnGeocodeSearchListener() {
@Override
public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {
}
@Override
public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
GeocodeAddress addr = geocodeResult.getGeocodeAddressList().get(0);
latLonPointEnd = addr.getLatLonPoint();
Log.e("end", latLonPointEnd.toString());
if (latLonPointEnd == null || latLonPointStart == null) {
Toast.makeText(MainActivity.this, "正在異步處理", Toast.LENGTH_SHORT).show();
} else {
Intent intent = new Intent(MainActivity.this, HomeActivity.class);
Bundle bundle = new Bundle();
//序列化的第二種方式
bundle.putParcelable("start", latLonPointStart);
bundle.putParcelable("end", latLonPointEnd);
intent.putExtras(bundle);
startActivity(intent);
}
}
});
}
}
在地圖頁面:
package com.example.im.android_map2;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.amap.api.maps.AMap;
import com.amap.api.maps.MapView;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.route.BusRouteResult;
import com.amap.api.services.route.DrivePath;
import com.amap.api.services.route.DriveRouteResult;
import com.amap.api.services.route.RideRouteResult;
import com.amap.api.services.route.RouteSearch;
import com.amap.api.services.route.WalkRouteResult;
import com.example.im.android_map2.overlay.DrivingRouteOverlay;
import butterknife.ButterKnife;
import butterknife.InjectView;
public class HomeActivity extends AppCompatActivity implements RouteSearch.OnRouteSearchListener {
@InjectView(R.id.map)
MapView map;
private LatLonPoint start;
private LatLonPoint end;
private AMap aMap;
private RouteSearch routeSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
ButterKnife.inject(this);
map.onCreate(savedInstanceState);
if (aMap == null) {
aMap = map.getMap();
}
start = getIntent().getExtras().getParcelable("start");
end = getIntent().getExtras().getParcelable("end");
Log.e("homeActivity開始", start.toString());
Log.e("homeActivity結束", end.toString());
routeSearch = new RouteSearch(this);
routeSearch.setRouteSearchListener(this);
RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(start, end);
// fromAndTo包含路徑規划的起點和終點,drivingMode表示駕車模式
// 第三個參數表示途經點(最多支持16個),第四個參數表示避讓區域(最多支持32個),第五個參數表示避讓道路
RouteSearch.DriveRouteQuery query = new RouteSearch.DriveRouteQuery(fromAndTo, RouteSearch.DrivingDefault, null, null, "");
routeSearch.calculateDriveRouteAsyn(query);// 異步路徑規划駕車模式查詢
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity執行onDestroy時執行mMapView.onDestroy(),銷毀地圖
map.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity執行onResume時執行mMapView.onResume (),重新繪制加載地圖
map.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity執行onPause時執行mMapView.onPause (),暫停地圖的繪制
map.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity執行onSaveInstanceState時執行mMapView.onSaveInstanceState (outState),保存地圖當前的狀態
map.onSaveInstanceState(outState);
}
@Override
public void onBusRouteSearched(BusRouteResult busRouteResult, int i) {
}
@Override
public void onDriveRouteSearched(DriveRouteResult driveRouteResult, int i) {
//自駕查詢結果
aMap.clear();// 清理地圖上的所有覆蓋物
final DrivePath drivePath = driveRouteResult.getPaths()
.get(0);
DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(
HomeActivity.this, aMap, drivePath,
driveRouteResult.getStartPos(),
driveRouteResult.getTargetPos(), null);
drivingRouteOverlay.setNodeIconVisibility(false);//設置節點marker是否顯示
drivingRouteOverlay.setIsColorfulline(true);//是否用顏色展示交通擁堵情況,默認true
drivingRouteOverlay.removeFromMap();
drivingRouteOverlay.addToMap();
drivingRouteOverlay.zoomToSpan();
}
@Override
public void onWalkRouteSearched(WalkRouteResult walkRouteResult, int i) {
}
@Override
public void onRideRouteSearched(RideRouteResult rideRouteResult, int i) {
}
}
private SharedPreferences preferences;
private SharedPreferences.Editor edit;
preferences = MainActivity.this.getSharedPreferences("user", MODE_PRIVATE);
edit = preferences.edit();
boolean isTrue = preferences.getBoolean("isTrue", false);
if (isTrue) {
Intent intent = new Intent(MainActivity.this, HomeActivity.class);
startActivity(intent);
finish();
}
edit.putBoolean("isTrue", true);
edit.commit();
Intent intent = new Intent(MainActivity.this, HomeActivity.class);
startActivity(intent);
finish();