關於Android整合高德地圖的那些事兒...顯示地圖
阿新 • • 發佈:2019-02-09
記得在2016年的時候, 有個專案需要在地圖上新增Marker 並且連點成線記錄座標 和 地理圍欄, 當時也是第一次做,確實有點懵, 不過時間久了, 也還挺簡單的 ; 最近專案中又用到了地圖 , 藉此機會 , 重構下之前的邏輯 , 之前用的是高德地圖 , 個人感覺還不錯 ,比某度好多了, 開始coding前不妨先下載官方的Demo 看下效果 , 參考下整合文件...
好了, 今天我們一起來完成高德3D地圖程式碼的整合 , 申請AppKey什麼的 , 請自己去高德地圖開放平臺的控制檯註冊
現在高德地圖整合已經支援了AndroidStudio依賴 , 不要太簡單了 , 這裡我整合的是3D map、定位、搜尋
dependencies {
implementation 'com.amap.api:3dmap:latest.integration'
implementation 'com.amap.api:search:latest.integration'
implementation 'com.amap.api:location:latest.integration'
}
宣告許可權來一波
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_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" /> <!-- 定位包、導航包需要的額外許可權(注:基礎許可權也需要) --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
清單檔案註冊高德地圖 APPKey在高德地圖的控制檯註冊
<!--定位服務-->
<service android:name="com.amap.api.location.APSService" />
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="APPkey" />
開始擼程式碼 , 先來個介面初始化;
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_map_layout); mapView = findViewById(R.id.mapView); mapView.onCreate(savedInstanceState); aMap = mapView.getMap(); aMap.getUiSettings().setScaleControlsEnabled(true);// 標尺開關 aMap.getUiSettings().setZoomControlsEnabled(false);//縮放按鈕 aMap.moveCamera(CameraUpdateFactory.zoomTo(ZOOM_MAP)); aMap.setMyLocationEnabled(true);//觸發定位 aMap.setLocationSource(this);//設定定位資源監聽(包含啟用定位和銷燬定位) initLocationOption();//初始化定位客戶端 }
初始化定位引數: 定位方式分為三種: Hight_Accuracy(高精度)、Battery_Saving(低功耗)、Device_Sensors(僅裝置)
private void initLocationOption() {
AMapLocationClientOption.AMapLocationMode mode;
if (Utils.isGpsOpen(this)) {
mode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy;//高精度模式。
Log.e(TAG, "當前定位模式為 --->>> 高精度模式");
} else if (Utils.isGpsNetWorkOpen(this)) {
mode = AMapLocationClientOption.AMapLocationMode.Battery_Saving;//低功耗模式。
Log.e(TAG, "當前定位模式為 --->>> 低功耗模式");
} else {
mode = AMapLocationClientOption.AMapLocationMode.Device_Sensors;//僅限裝置模式。
Log.e(TAG, "當前定位模式為 --->>> 僅限裝置模式");
}
if (mLocationOption == null) {
mLocationOption = new AMapLocationClientOption()
.setLocationMode(mode)
.setNeedAddress(true)//設定是否返回地址資訊(預設返回地址資訊)
.setInterval(2000)//設定定位間隔,單位毫秒,預設為2000ms,最低1000ms。
.setHttpTimeOut(8000)//單位是毫秒,預設30000毫秒,建議超時時間不要低於8000毫秒。
.setLocationCacheEnable(true);//快取機制預設開啟,可以通過以下介面進行關閉。
} else {
mLocationOption.setLocationMode(mode);
}
if (mLocationClient == null) {
mLocationClient = new AMapLocationClient(getApplicationContext());//初始化定位
mLocationClient.setLocationListener(this);//設定定位回撥監聽
mLocationClient.setLocationOption(mLocationOption);
} else {
mLocationClient.setLocationOption(mLocationOption);
}
mLocationClient.startLocation();//啟動定位
}
啟用定位
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
initLocationOption();
mLocationListener = onLocationChangedListener;
}
銷燬定位 和 實現地圖的生命週期管理
@Override
public void deactivate() {
releaseClient();
}
@Override
protected void onResume() {
super.onResume();
if (mapView != null) mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
if (mapView != null) mapView.onPause();
if (mLocationClient != null) mLocationClient.stopLocation();//停止定位後,本地定位 服務並不會被銷燬
}
private void releaseClient() {
if (mLocationClient != null) {
mLocationClient.stopLocation();//停止定位後,本地定位服務並不會被銷燬
mLocationClient.onDestroy();//銷燬定位客戶端,同時銷燬本地定位服務。
mLocationClient = null;
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mapView != null) mapView.onSaveInstanceState(outState);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mapView != null) mapView.onDestroy();
releaseClient();
}
定位回撥,可在onLocationChanged() 拿到當前定位的座標資訊
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null) {
LatLng latLng;
if (aMapLocation.getErrorCode() == 0) {
this.aMapLocation = aMapLocation;
if (mLocationClient != null) {
mLocationClient.stopLocation();
}
mLocationListener.onLocationChanged(aMapLocation);//顯示系統定位小藍點
latLng = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude());
} else {
latLng = centerLatLng;//定位失敗時 預設的地圖中心點
Toast(aMapLocation.getErrorInfo());
//定位失敗時,可通過ErrCode(錯誤碼)資訊來確定失敗的原因,errInfo是錯誤資訊,詳見錯誤碼錶。
Log.e("AmapError", "location Error, ErrCode:"
+ aMapLocation.getErrorCode() + ", errInfo:"
+ aMapLocation.getErrorInfo());
}
aMap.moveCamera(CameraUpdateFactory.changeLatLng(latLng));//定位回撥後,將地圖移動至定位點
}
}
最後送上預覽圖片