效果图:
教程:
由于官网的教程不是很详细,相信很多小白们有点看不懂,比如我,看的都是一脸懵逼,相比较而言,百度地图的教程要更详细一点!推荐新手先拿百度教程来练练手,熟悉下地图的业务逻辑,地图类逻辑都差不多,好了不多说,开始正文。
首先,去高德官网下载所需的地图库并申请key,附:http://lbs.amap.com/
下载的jar包导入到as里面,然后配置清单文件:
权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<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" />
<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>
<service android:name="com.amap.api.location.APSService">service>
<meta-data android:name="com.amap.api.v2.apikey" android:value="这里是你对应的key">
meta-data>
application>
在xml布局文件中引用地图控件(注意!这里的引入的MapView路径是“com.amap.api.maps2d.MapView”,官网地图那里应该是3d包里的是“com.amap.api.maps.MapView”,如果下载sdk里面不包含3d视图的可能应用会报错!!!):
<com.amap.api.maps2d.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent" />
在activity中引用:
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.map);
//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),实现地图生命周期管理
mMapView.onCreate(savedInstanceState);
if (aMap == null) {
aMap = mMapView.getMap();
//UiSettings 主要是对地图上的控件的管理,比如指南针、logo位置(不能隐藏).....
UiSettings settings = aMap.getUiSettings();
//设置了定位的监听,这里要实现LocationSource接口
aMap.setLocationSource(this);
// 是否显示定位按钮(据我所知不能更改,知道的麻烦告我一声)
settings.setMyLocationButtonEnabled(true);
//添加指南针
//settings.setCompassEnabled(true);
//aMap.getCameraPosition(); 方法可以获取地图的旋转角度
//管理缩放控件
settings.setZoomControlsEnabled(true);
//设置logo位置,左下,底部居中,右下(隐藏logo:settings.setLogoLeftMargin(9000))
settings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_LEFT);
//设置显示地图的默认比例尺
settings.setScaleControlsEnabled(true);
//每像素代表几米
//float scale = aMap.getScalePerPixel();
aMap.setMyLocationEnabled(true);//显示定位层并且可以触发定位,默认是flase
}
//开始定位
location();
location()方法里面主要就是设置一下定位的参数:
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
mLocationClient.setLocationListener(this);
//初始化定位参数
mLocationOption = new AMapLocationClientOption();
//设置定位模式为Hight_Accuracy高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);
//设置是否只定位一次,默认为false
mLocationOption.setOnceLocation(false);
//设置是否强制刷新WIFI,默认为强制刷新
mLocationOption.setWifiActiveScan(true);
//设置是否允许模拟位置,默认为false,不允许模拟位置
mLocationOption.setMockEnable(false);
//设置定位间隔,单位毫秒,默认为2000ms
mLocationOption.setInterval(2000);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
另外当前activity需要实现LocationSource与AMapLocationListener,并实现3个方法:
/**
* 定位成功后回调函数
*/
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
//可在其中解析amapLocation获取相应内容。
aMapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
lat = aMapLocation.getLatitude();//获取纬度
lon = aMapLocation.getLongitude();//获取经度
aMapLocation.getAccuracy();//获取精度信息
aMapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
aMapLocation.getCountry();//国家信息
aMapLocation.getProvince();//省信息
aMapLocation.getCity();//城市信息
aMapLocation.getDistrict();//城区信息
aMapLocation.getStreet();//街道信息
aMapLocation.getStreetNum();//街道门牌号信息
aMapLocation.getCityCode();//城市编码
aMapLocation.getAdCode();//地区编码
aMapLocation.getAoiName();//获取当前定位点的AOI信息
//获取定位时间
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(aMapLocation.getTime());
df.format(date);
// 如果不设置标志位,此时再拖动地图时,它会不断将地图移动到当前的位置
if (isFirstLoc) {
//设置缩放级别(缩放级别为4-20级)
aMap.moveCamera(CameraUpdateFactory.zoomTo(zoomlevel));
//将地图移动到定位点
aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude())));
//点击定位按钮 能够将地图的中心移动到定位点
mListener.onLocationChanged(aMapLocation);
//获取定位信息
StringBuffer buffer = new StringBuffer();
buffer.append(aMapLocation.getCountry() + ""
+ aMapLocation.getProvince() + ""
+ aMapLocation.getCity() + ""
+ aMapLocation.getProvince() + ""
+ aMapLocation.getDistrict() + ""
+ aMapLocation.getStreet() + ""
+ aMapLocation.getStreetNum());
Toast.makeText(getApplicationContext(), buffer.toString(), Toast.LENGTH_LONG).show();
isFirstLoc = false;
}
}else {
//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
Log.e("地图错误","定位失败, 错误码:" + aMapLocation.getErrorCode() + ", 错误信息:"
+ aMapLocation.getErrorInfo());
}
}
}
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mListener = onLocationChangedListener;
}
@Override
public void deactivate() {
mListener = null;
}
然后在activity的生命周期方法里添加地图相应的声明周期方法就行了:
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
mLocationClient.stopLocation();//停止定位
mLocationClient.onDestroy();//销毁定位客户端。
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView.onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView.onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),实现地图生命周期管理
mMapView.onSaveInstanceState(outState);
}
如果想要自定义定位功能,只需要调用aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(纬度,经度),缩放级别))
就可以了(这些在下面的源码里面写的很清楚)(注:缩放级别为4-20级)
源码下载:点击免费下载