使用前准备
SDK下载
地址:<u>http://lbs.amap.com/api/android-sdk/down/</u>
Jar包与库文件的使用
在项目中按照如上方法使用高德地图的库文件和jar包
AMap_3DMap….jar---使用高德3D地图的jar包
AMap_Location….jar---定位相关功能使用的jar包
此外还有:
搜索使用的jar包
获取Key
登陆高德地图API <u>http://lbs.amap.com/dev/#/</u> 控制台
创建应用,添加key
Key名称:自定义设置
服务平台:填写对应的开发平台,这里是Android
发布版安全码SHA1:开发的APP的SHA码
Package:这里填写包名,要填写使用的app的包名
AndroidManifest.xml的配置
权限配置:
//地图包、搜索包需要的基础权限
<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.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
配置Key值:
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="4048e214cf637ef2931e517a8dd2cecc" />
设置定位服务的Service
<!-- 定位需要的服务 使用2.0的定位需要加上这个 -->
<service android:name="com.amap.api.location.APSService" />
高德地图使用
定义MapView
private MapView mapView;
先获取布局中的mapview的id,然后创建实例,具体如下:
mapView = (MapView) findViewById(R.id.mapview);
mapView.onCreate(savedInstanceState);// 此方法必须重写
在使用map的activity中必须重写一下方法:
@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);
}
销毁地图
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
在整个activity生命周期中实现对MapView的控制
其次初始化map对象
/**
* 初始化AMap对象
*/
if (aMap == null) {
aMap = mapView.getMap();
}
Xml布局引入
<com.amap.api.maps.MapView
android:id="@+id/mapview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
接口说明:
MapView 一个显示地图的视图(View)。它负责从服务端获取地图数据。当屏幕焦点在这个视图上时,它将会捕捉键盘事件(如果手机配有实体键盘)及屏幕触控手势事件。 使用这个类必须按照它的生命周期进行操控,你必须参照以下方法onCreate(Bundle)、 onResume()、onPause()、onDestroy()、onSaveInstanceState(Bundle)、onLowMemory() 当MapView初始化完成后,用户可以通过getMap()方法获得一个AMap 对象。如果MapView 没有初始成功,则执行getMap()将返回null
AMap定义AMap 地图对象的操作方法与接口
地图定位
图 2.2.0
实现的接口与重写的方法
方法需要继承
implements LocationSource,AMapLocationListener
LocationSource重写LocationSource的两个方法,目的是是让地图显示定位地点。(如下:激活定位activate、停止定位deactivate,其中deactivate需要在activity的onPause中调用释放定位占用的资源)
/**
* 激活定位
*/
@Override
public void activate(OnLocationChangedListener listener) {
mListener = listener;
if (mlocationClient == null) {
mlocationClient = new AMapLocationClient(this);
mLocationOption = new AMapLocationClientOption();
//设置定位监听
mlocationClient.setLocationListener(this);
//设置为高精度定位模式
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
//设置定位参数
mlocationClient.setLocationOption(mLocationOption);
// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
// 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求
// 在定位结束后,在合适的生命周期调用onDestroy()方法
// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
mlocationClient.startLocation();
}
}
/**
* 停止定位
*/
@Override
public void deactivate() {
mListener = null;
if (mlocationClient != null) {
mlocationClient.stopLocation();
mlocationClient.onDestroy();
}
mlocationClient = null;
}
AMapLocationListenter高德定位监听
##定义AMap 地图对象的操作方法与接口。
private AMap aMap;
设置定位监听
aMap.setLocationSource(this);// 设置定位监听
// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
aMap.setMyLocationEnabled(true);
设置定位间隔
使用AMapLocationClientOption中的setinterval方法,
private AMapLocationClientOption mLocationOption;
mLocationOption = new AMapLocationClientOption();
mLocationOption.setInterval(2000);//设置间隔时间
设置当前定位模式:
定位类型总共有三种模式,定位,跟随和旋转
// 设置定位的类型为定位模式
aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);
// 设置定位的类型为 跟随模式
aMap.setMyLocationType(AMap.LOCATION_TYPE_MAP_FOLLOW);
// 设置定位的类型为根据地图面向方向旋转
aMap.setMyLocationType(AMap.LOCATION_TYPE_MAP_ROTATE);
使用方式的确定根据需要确定定位模式,更随模式和旋转模式
定位图标
使用高德原生定位图标,此方法的实现只要一行代码便可以实现,较为简单
方法:aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置、
如果发现自定义图标不怎么美观,我们也可以使用自定义图标,可以随意定义,实现如下:
aMap.getUiSettings().setMyLocationButtonEnabled(false);// 设置默认定位按钮是否显示
//设置地图定位图标
MyLocationStyle myLocationStyle = new MyLocationStyle();
myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.mipmap.mapshow_location));//设置图标样式
//以下两行设置定位图标周围的圆圈背景为透明
myLocationStyle.radiusFillColor(android.R.color.transparent);
myLocationStyle.strokeColor(android.R.color.transparent);
//实现图标样式
aMap.setMyLocationStyle(myLocationStyle);
自定义图标的自由度较高,可以根据不同的需要设置不同的图标样式,在使用时我们需要先把地图中本身的图标设置为false:aMap.getUiSettings().setMyLocationButtonEnabled(false);使地图自带的图标不显示,然后设置我们想要的图标的样式
以上方法需要的地图初始化的时候统一调用
注;android6.0级以上版本需要先获取定位权限
获取权限的代码:
//检查Adroid版本是否高于23,并判断定位权限是否开启
private void startMyLocation() {
if (Build.VERSION.SDK_INT >= 23) {
int checkPermission = ContextCompat.checkSelfPermission(MapActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION);
if (checkPermission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MapActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
return;
} else {
此处调用地图初始化时的定位功能
}
} else {
此处调用地图初始化时的定位功能
}
}
返回权限请求的结果
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//启动定位
此处调用地图初始化时的定位功能
} else {
showToast("您禁止了定位权限,导致定位功能不可用,您可以选择使用时手动开启");
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
Manifest.permission.ACCESS_COARSE_LOCATION定位权限
自定义按钮实现回到当前位置的方法
高德地图只提供了自身的一个定位回到当前位置的按钮,API未提供接口方法;如果不适用高德地图自定义的按钮,可以参考一下方法进行实现回到当前位置的自定义方法:
//定位按钮实现定位
public void BackMyLocation() {
//判断地图定位返回,是否为空
if (aMap.getMyLocation() != null) {
//获取定位点的经纬度坐标
Dlongitude = aMap.getMyLocation().getLongitude();
DLatitude = aMap.getMyLocation().getLatitude();
LatLng start = new LatLng(DLatitude, Dlongitude);
//实现移动到定位点的功能
aMap.moveCamera(CameraUpdateFactory.changeLatLng(start));
aMap.moveCamera(CameraUpdateFactory.zoomTo(10));
} else {
showToast("正在定位,请检查网络或者定位权限是否开启");
}
}
定位成功后回调的参数:
/**
* 定位成功后回调函数
*/
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (mListener != null && amapLocation != null) {
if (amapLocation != null
&& amapLocation.getErrorCode() == 0) {
mListener.onLocationChanged(amapLocation);// 显示系统小蓝点
} else {
String errText = "定位失败," + amapLocation.getErrorCode()+ ": " + amapLocation.getErrorInfo();
Log.e("AmapErr",errText);
}
}
}
以前写的文章没有发表的,仅供参考和学习只用
谢谢惠顾,感觉有用的点个赞