记得在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));//定位回调后,将地图移动至定位点
}
}
最后送上预览图片