使用前准备
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);
- }
- }
- }
以前写的文章没有发表的,仅供参考和学习只用
谢谢惠顾,感觉有用的点个赞