之前项目需求要用到高德地图,本人作为一只新手菜鸟,在网上膜拜学习了众多大神的帖子后,终于得以完成,然后在这里做个简单的总结和大家分享。
主要参考资料:<第一行代码> 高德地图官方开发文档
必须强调一点,在学习大神帖子的时候,有很多时间较早,接口方法已经过时了,导致自己绕了很多弯路(好吧,主要还是自己菜鸡)。所以在这里主要推荐上面两个参考资料,官方资料是最新的。最后附上官方开发文档网址:
先说一下大体的流程吧:
- 准备工作:注册高德开发者;在控制台创建应用;获取API Key
- 下载高德地图SDK,定位SDK
- 显示地图
- 添加定位
准备工作
官方文档上很详细,资料也很多,略过。
强调一点:SDK分为地图SDK和定位SDK,这两个功能是不一样的。另外使用3D地图是要把so文件放到文件夹 jniLibs
代码实例
为便于日后使用,这里特意写成了一个工具类
AmapUtils工具类代码
import android.content.Context;
import android.util.Log;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps2d.AMap;
import com.amap.api.maps2d.CameraUpdateFactory;
import com.amap.api.maps2d.MapView;
import com.amap.api.maps2d.UiSettings;
import com.amap.api.maps2d.model.LatLng;
import com.amap.api.maps2d.model.MyLocationStyle;
import java.text.SimpleDateFormat;
import java.util.Date;
public class AMapUtils {
private static LatLng latLng;
//获取显示地图的对象
private static AMap aMap;
private static AMapLocationClient aMapLocationClient = null;
//获取地址详情
public interface MyLocationResult{
void locationResult(AMapLocation aMapLocation);
void locationError(AMapLocation aMapLocation);
}
public static void initMap(MapView mapView){
//初始化 AMap 对象
aMap = mapView.getMap();
//实现定位蓝点 默认是蓝点 也可以自定义图片
MyLocationStyle myLocationStyle = new MyLocationStyle();
myLocationStyle.radiusFillColor(android.R.color.transparent);
myLocationStyle.strokeColor(android.R.color.transparent);
aMap.setMyLocationStyle(myLocationStyle);
//设置AMap的UI界面
UiSettings settings = aMap.getUiSettings();
//是否显示定位按钮
settings.setMyLocationButtonEnabled(true);
//是否显示地图默认的缩放按钮
settings.setZoomControlsEnabled(false);
//设置缩放级别
aMap.moveCamera(CameraUpdateFactory.zoomTo(17));
//设置为true表示启动显示定位蓝点(这里会进行初次定位),false表示隐藏定位蓝点并不进行定位,默认是false
aMap.setMyLocationEnabled(true);
}
//初始化定位
public static void initLocation(Context context){
aMapLocationClient = new AMapLocationClient(context);
initClientOption();
}
//配置参数并启动定位
private static void initClientOption(){
AMapLocationClientOption option = new AMapLocationClientOption();
//选择定位模式
option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置单次定位
option.setOnceLocation(false);
//设置定位间隔,单位毫秒,默认为2000ms,最低1000ms
option.setInterval(2000);
//设置是否返回地址信息(默认返回地址信息)
option.setNeedAddress(true);
//设置是否返回地址信息(默认返回地址信息)
option.setMockEnable(false);
//设置是否强制刷新WIFI,默认为强制刷新
option.setWifiScan(true);
//给定位客户端对象设置定位参数
aMapLocationClient.setLocationOption(option);
//启动定位
aMapLocationClient.startLocation();
}
//声明定位回调监听器,获取定位结果
public static void getCurrentLocation(final MyLocationResult result){
aMapLocationClient.setLocationListener(new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null && result != null) {
if (aMapLocation.getErrorCode() == 0){
//定位成功回调信息,设置相关消息
aMapLocation.getLocationType(); //获取当前定位结果来源,如网络定位结果,详见官方定位类型表
aMapLocation.getLatitude(); //获取纬度
aMapLocation.getLongitude(); //获取经度
aMapLocation.getAccuracy(); //获取精度信息
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(aMapLocation.getTime());
df.format(date); //定位时间
aMapLocation.getAddress(); //地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
aMapLocation.getCountry(); //国家信息
aMapLocation.getProvince(); //省信息
aMapLocation.getCity(); //城市信息
aMapLocation.getDistrict(); //城区信息
aMapLocation.getStreet(); //街道信息
aMapLocation.getStreetNum(); //街道门牌号信息
aMapLocation.getCityCode(); //城市编码
aMapLocation.getAdCode(); //地区编码
latLng = new LatLng(aMapLocation.getLatitude(),aMapLocation.getLongitude());
//获取定位信息
StringBuilder buffer = new StringBuilder();
buffer.append( aMapLocation.getProvince() + "" + aMapLocation.getCity() + "" + aMapLocation.getDistrict() + "" + aMapLocation.getStreet());
// Log.e("AMapUtils","location buffer:" + buffer);
result.locationResult(aMapLocation);
}
} else {
//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
Log.e("AmapError", "location Error, ErrCode:" + aMapLocation.getErrorCode() + ", errInfo:" + aMapLocation.getErrorInfo());
result.locationError(aMapLocation);
}
}
});
}
//将地图移动到定位点(只自定义刷新按钮时调用)
public static void moveLocation(){
aMap.moveCamera(CameraUpdateFactory.changeLatLng(latLng));
}
//停止定位
public static void stopLocation(){
//停止定位后,本地定位服务并不会被销毁
aMapLocationClient.stopLocation();
//销毁定位客户端,同时销毁本地定位服务
aMapLocationClient.onDestroy();
}
}
Activity中调用代码
@BindView(R.id.mMapview) //地图控件
MapView mapView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mapView.onCreate(savedInstanceState);
}
@Override
public void initView() {
initMap(mapView);
initLocation(getApplicationContext());
}
@Override
public void initData() {
AMapUtils.getCurrentLocation(new AMapUtils.MyLocationResult() {
@Override
public void locationResult(AMapLocation aMapLocation) {
StringBuilder buffer = new StringBuilder();
buffer.append( aMapLocation.getProvince() + "" + aMapLocation.getCity() + "" + aMapLocation.getDistrict() + "" + aMapLocation.getStreet());
tvAddress.setText(buffer);
}
@Override
public void locationError(AMapLocation aMapLocation) {
Log.e("AmapError", "location Error, ErrCode:" + aMapLocation.getErrorCode() + ", errInfo:" + aMapLocation.getErrorInfo());
}
});
}
@Override
protected void onDestroy() {
stopLocation();
// Toast.makeText(this,"停止定位", Toast.LENGTH_SHORT).show();
mapView.onDestroy();
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}