文章目录

  • 申请接入流程
  • 显示高德地图
  • 显示定位
  • Marker 显示地图标记
  • Route 路线规划
  • Search 搜索

申请接入流程


1、首先到 [ 高德地图API官网] 申请注册帐号
2、进入控制台,点击应用管理,我们创建一个新的应用:

3、为刚才创建的应用添加key:

随便输入一个key的名称,这里我们只讨论Android平台,所以服务平台选Android平台,选了Android后则需要填写SHA1,一个发布版和一个调试版。在这里如果我们的应用还没有正式签名的话,就先用自己随便生成的签名来填写进去,(有读者不了解如何生成签名或者不知道如何获取SHA1的话,请看官网教程 常见问题 | 高德地图API )。后面正式发布的时候再修改回来即可,修改SHA1也无需审核。
最后我们填写下应用的包名 勾选同意后,即可生成一个key。
是不是很简单。
申请接入流程非常的简单。

显示高德地图


申请好了一个key后,我们需要把key填写到里面AndroidManifests.xml里面:

       <meta-dataandroid:name="com.amap.api.v2.apikey"android:value="你申请的key"/>
  • 1
  • 2
  • 3

需要特别注意的是,需要包含在application节点里面才有效。

然后我们添加如下权限(地图SDK(包含其搜索功能)需要的基础权限):

<!--允许程序打开网络套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许程序设置内置sd卡的写权限-->
<uses-permission android:name="android.permission.WRITE_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" />
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

然后添加依赖包和so库平台:

android {defaultConfig {ndk {//设置支持的SO库架构(开发者可以根据需要,选择一个或多个平台的so)abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86","arm64-v8a","x86_64"}}
}

dependencies {
compile fileTree(dir: ‘libs’, include: [’*.jar’])
//3D地图so及jar
compile ‘com.amap.api:3dmap:latest.integration’
//定位功能
compile ‘com.amap.api:location:latest.integration’
//搜索功能
compile ‘com.amap.api:search:latest.integration’
//2D地图
compile ‘com.amap.api:map2d:latest.integration’
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

根据你的业务需求,这里我们不讨论3D地图的方式,基本上和2D地图是一样的。

OK,到这里基本的配置步骤就结束了,我们可以开始来写代码了。

最先提及的是MapView这个控件,它是地图容器。 用于在布局中中放置地图。我们简单来演示一下如何利用MapView显示地图。
首先在布局xml文件中添加地图控件,而官方文档会这么教你:

<com.amap.api.maps.MapView
android:id="@+id/map"android:layout_width="match_parent"android:layout_height="match_parent"/&gt;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

而运行时却报错:Caused by: android.view.InflateException: Binary XML file line #10: Error inflating class com.amap.api.maps.MapView


  • 1

这是大坑,正确的做法是,如果你是2D地图的话,则类的全名是:com.amap.api.maps2d.MapView。可以在代码里面输入MapView后查看自动导包的包名
然后在Activity的onCreate方法中添加代码即可:

  //获取地图控件引用mMapView = (MapView) findViewById(R.id.map);//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图mMapView.onCreate(savedInstanceState);
  • 1
  • 2
  • 3
  • 4

这里特别需要说明的是需要注意MapView的生命周期,最好是要跟Activity的生命周期保持一致,避免内存泄漏。为此官方也给我们封装好了MapView对应的生命周期:

public class MainActivity extends Activity {MapView mMapView = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);//获取地图控件引用mMapView = (MapView) findViewById(R.id.map);//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图mMapView.onCreate(savedInstanceState);}@Overrideprotected void onDestroy() {super.onDestroy();//在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图mMapView.onDestroy();}@Overrideprotected void onResume() {super.onResume();//在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图mMapView.onResume();}@Overrideprotected void onPause() {super.onPause();//在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制mMapView.onPause();}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态mMapView.onSaveInstanceState(outState);}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

到这一步我们就可以显示出来地图了


如果需要地图显示其他什么元素,比如放大缩小,指南针 ,定位图标,logo等等,都可以通过获取UISettings这个类来设置,通过:

mMapView.getMap().getUiSettings()
  • 1

显示定位


首先我们需要先注册一个定位服务:

 <!--定位--><service android:name="com.amap.api.location.APSService"></service>
  • 1
  • 2

蓝点图标的样式主要是这个类:MyLocationStyle ,我们通过对这个类的自定义设置,最后调用mMapView.getMap().setMyLocationStyle(myLocationStyle);即可

设置蓝点图标,也可以自定义 方法如下:

    /*** 显示定位蓝点图标*/private void initLocationStyle() {BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.drawable.main_location_icon);//自定义蓝点图标MyLocationStyle myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。myLocationStyle.myLocationIcon(descriptor);
//        myLocationStyle.interval(2000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。
//        myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW);//连续定位、且将视角移动到地图中心点,定位蓝点跟随设备移动。(1秒1次定位)myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE);//定位一次,且将视角移动到地图中心点。myLocationStyle.strokeColor(getResources().getColor(R.color.colorPrimary));// 设置圆形的边框颜色myLocationStyle.radiusFillColor(getResources().getColor(R.color.colorPrimary_50));// 设置圆形的填充颜色mMapView.getMap().setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
//        mMapView.getMap().getUiSettings().setMyLocationButtonEnabled(true);//设置默认定位按钮是否显示,非必需设置。mMapView.getMap().setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

调用上面的方法即可实现定位。
如果需要实时监听位置的变化,我们可以加个监听:

/*** 定位的监听回调*/private void initLocationListener() {
//初始化定位AMapLocationClient mLocationClient = new AMapLocationClient(getApplicationContext());//声明定位回调监听器AMapLocationListener mLocationListener = new AMapLocationListener() {@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {LogUtils.i(TAG, "aMapLocation:" + aMapLocation.getAddress());//获取纬度LogUtils.i(TAG, "aMapLocation:" + aMapLocation.getLatitude());LogUtils.i(TAG, "aMapLocation:" + aMapLocation.getLongitude());LogUtils.i(TAG, "aMapLocation==null:" + (aMapLocation == null));if (aMapLocation != null) {if (aMapLocation.getErrorCode() == 0) {
//可在其中解析amapLocation获取相应内容。LogUtils.i(TAG, "aMapLocation:" + aMapLocation.getPoiName());current_latitude = aMapLocation.getLatitude();current_longitude = aMapLocation.getLongitude();} else {//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。LogUtils.i(TAG, "location Error, ErrCode:"+ aMapLocation.getErrorCode() + ", errInfo:"+ aMapLocation.getErrorInfo());}}}};
//设置定位回调监听mLocationClient.setLocationListener(mLocationListener);
//启动定位mLocationClient.startLocation();}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

到这里就实现了定位以及定位的监听。如下效果图:

默认的情况下,其实并不是这样子的,这是笔者在运行后放大了地图后的结果。
而通常我们是需要显示定位,并且放大到某个级别的,那么可以通过如下设置轻松设置:

  //设置希望展示的地图缩放级别。 缩放等级为1-19级mMapView.getMap().moveCamera(CameraUpdateFactory.zoomTo(18));
  • 1
  • 2

Marker 显示地图标记


可能我们需要标记出地图上的某些东西,比如我们做了一个奶茶店的app,需要显示附近的奶茶店。那么我们可以通过后台返回来经度和纬度来标记出来,标记经纬度我们用到一个类:LatLng,该类构造方法时传入一个经度一个纬度,都是float型。
然后我们通过创建一个MarkerOptions类,这个MarkerOptions可以让我们构建标记的显示,我们也是可以自定义的view传进去的,后面再说。当我们构建好MarkerOptions后就可以通过mMapView.getMap().addMarker()方法,把我们的MarkerOptions传递进去,即可形成一个标记。
代码如下:

 LatLng latLng = new LatLng(22.56686, 114.170988);MarkerOptions markerOption = new MarkerOptions();markerOption.title("我是Title").snippet("market desc market desc");markerOption.draggable(true);//设置Marker可拖动markerOption.position(latLng);markerOption.icon(BitmapDescriptorFactory.fromResource(R.drawable.main_marker_icon));//设置覆盖物比例markerOption.anchor(0.5f, 0.5f);Marker marker = mMapView.getMap().addMarker(markerOption);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这样子还不能在地图上显示出来,我们还需要调用:

 marker.showInfoWindow();
  • 1

这样就可以显示出来了:

而我们旺旺需要自定义浮现的布局样式,那么可以通过AMap.InfoWindowAdapter类来适配一个布局
代码如下:

 mMapView.getMap().setInfoWindowAdapter(new () {@Overridepublic View getInfoWindow(Marker marker) {return LayoutInflater.from(getContext()).inflate(R.layout.marker,null);}
        @Overridepublic View getInfoContents(Marker marker) {return LayoutInflater.from(getContext()).inflate(R.layout.marker,null);}});

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

然后设置监听:

 //点击标记弹出框mMapView.getMap().setOnMarkerClickListener(new AMap.OnMarkerClickListener() {@Overridepublic boolean onMarkerClick(Marker marker) {if (!marker.isInfoWindowShown()) {marker.showInfoWindow();} else {marker.hideInfoWindow();}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

比较简单。

Route 路线规划


当我们把店铺标记出来后,想要规划去这个店铺的路线怎么做呢
思路就是根据这个店铺的经纬度,我们利用RouteSearch这个类来实现
用LatLonPoint构造出一个经纬度的坐标点,我们构造出两个,分别是出发点的经纬度和目的地的经纬度,出发点的经纬度可以根据上面我们提到的定位监听回调里面获取当前的经纬度。然后利用这两个坐标构造出RouteSearch.FromAndTo对象

//当前经纬度LatLonPoint pointFrom = new LatLonPoint(current_latitude, current_longitude);//目的地的经纬度
LatLonPoint pointTo = new LatLonPoint(latitude, longitude);

RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(pointFrom, pointTo);

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

有了这个后,我们构造出一个查询,并且开始算出路线:

 //初始化query对象,fromAndTo是包含起终点信息,walkMode是步行路径规划的模式 mode,计算路径的模式。SDK提供两种模式:RouteSearch.WALK_DEFAULT 和 RouteSearch.WALK_MULTI_PATH。RouteSearch.WalkRouteQuery query = new RouteSearch.WalkRouteQuery(fromAndTo, RouteSearch.WALK_DEFAULT);RouteSearch routeSearch = new RouteSearch(this);routeSearch.calculateWalkRouteAsyn(query);//开始算路
  • 1
  • 2
  • 3
  • 4

当然我们是需要路线规划出来的回调的,才能把它显示出来,不然就没用了:

  routeSearch.setRouteSearchListener(new RouteSearch.OnRouteSearchListener() {@Overridepublic void onBusRouteSearched(BusRouteResult busRouteResult, int i) {
        }@Overridepublic void onDriveRouteSearched(DriveRouteResult driveRouteResult, int i) {}@Overridepublic void onWalkRouteSearched(WalkRouteResult walkRouteResult, int i) {}@Overridepublic void onRideRouteSearched(RideRouteResult rideRouteResult, int i) {}});

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

通过实现RouteSearch.OnRouteSearchListener接口,该接口有几个需要实现的方法,不难对应就是不同交通工具的规划:公交、自驾、步行等。
这里我们来画出一个步行的路线,通过回调方法:onWalkRouteSearched(WalkRouteResult walkRouteResult, int i)

实现该接口方法如下:

  @Overridepublic void onWalkRouteSearched(WalkRouteResult walkRouteResult, int i) {if (i == 1000) {//1000代表成功//在地图上绘制路径:MyWalkRouteOverlay walkRouteOverlay = new MyWalkRouteOverlay(getBaseContext(), mMapView.getMap(), walkRouteResult.getPaths().get(0), walkRouteResult.getStartPos(), walkRouteResult.getTargetPos());walkRouteOverlay.setNodeIconVisibility(false);
//                    mMapView.getMap().clear();walkRouteOverlay.removeFromMap();walkRouteOverlay.addToMap();//将Overlay添加到地图上显示walkRouteOverlay.zoomToSpan();//调整地图能看到起点和终点lastWalkRouteOverlay = walkRouteOverlay;}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这样就轻松的画出一条路线了,我们还可以通过继承WalkRouteOverlay这个类,来得到起点、终点、中间的图标以及路线的颜色、宽度等等。

Search 搜索


地图搜索的个人感觉官方说的是比较详细的,这处不必要累赘什么。
建议读者到官方网站上了解: 搜索 | 高德地图API

快速接入高德地图SDK(地图+定位+标记+路线规划+搜索)相关推荐

  1. Android开发知识(十)快速接入高德地图SDK(地图+定位+标记+路线规划+搜索)

    文章目录 申请接入流程 显示高德地图 显示定位 Marker 显示地图标记 Route 路线规划 Search 搜索 申请接入流程 1.首先到 [ 高德地图API官网] 申请注册帐号 2.进入控制台, ...

  2. openlayers调用高德地图web服务绘制驾车路线规划

    openlayers调用高德地图web服务绘制驾车路线规划 使用ol.geom.Polygon()函数将坐标点连接成线时,只连接数组中首末两点的坐标,是因为数组中的值并非number类型,需要将其进行 ...

  3. android百度地图路线查询,Android百度地图——路线规划搜索

    百度地图提供的路线规划搜索有3种:驾车.公交.步行. 3中方式的使用方法类似,步骤如下: 1.初始化地图 /**初始化百度地图 * */ private void initBaiduMap(){ // ...

  4. uni-app接入高德地图SDK实现定位用户城市

    参考文章:http://ask.dcloud.net.cn/article/35070 本文以高德微信小程序 SDK 为例,简述如何在 uni-app 中利用微信小程序第三方 SDK,实现 App 端 ...

  5. IOS接入百度地图SDK,百度定位SDK记录

    地图显示 Xcode新建一个项目,我取名叫BaiduMapIOSAgain,包名为com.unity.BaiduMapIOSAgain. 在百度SDK的控制台创建应用,过程略,跟着官方说明即可 首先先 ...

  6. 高德地图 SDK集成 定位 地理编码 搜索 经纬度获取 功能工具类

    最近项目要集成高德地图,然后可以根据语音输入指令,进行定位和地理编码搜索功能,从而实现获取当前位置经纬度和根据地址获取经纬度的功能 下载文件之只放了libs和主要代码文件 https://downlo ...

  7. 百度地图SDK无法定位到当前所在位置;一直显示天安门

    按照百度官方SDK接入百度地图SDK后,进行地图定位的时候,缩小界面,显示出了定位图标,但是打开地图界面,一直显示天安门的位置. /*** 初始化定位内容*/private void initLoca ...

  8. Unity3D 集成 高德地图SDK 地图

    哈哈如果写的不好见谅,效仿大神记录问题共同进步. 软件版本: Unity:5.4 Android Studio:2.2 高德地图SDK:4.1.2 开始,Android Studio端的不再写了大神文 ...

  9. android百度地图sdk定位权限,Android:使用百度地图SDK实现定位:下载SDK、申请密钥、动态获得Android权限...

    最近想实现一个打卡的功能,想到可以利用百度地图的SDK.网上有很多关于百度地图SDK定位.地图功能应用的demo,这部分倒不是很困难.但网上很多博客写的内容一般都着重于代码部分,很多下载配置和编译器设 ...

最新文章

  1. 外包网络推广公司浅析网站如何通过修改网站标题来提升排名?
  2. Android Material Design :LinearLayoutCompat添加分割线divider
  3. 全民学英语,VIPKID、51Talk、伴鱼、阿卡索们还好做么?
  4. 子弹短信体验分析:一个单纯想“快”的IM工具 子弹短信体验分析:锤科情怀缩影,打败微信有点远
  5. 【阿里妈妈数据科学系列】第二篇:在线分流框架下的AB Test
  6. Linux 服务器注意事项
  7. Spring Cloud Edgware新特性之八:Zuul回退的改进
  8. 测试用例综合设计方法
  9. [SDK2.2]Windows Azure Storage (16) 使用WCF服务,将本地图片上传至Azure Storage (上) 客户端代码...
  10. 系统上云服务器地址,可以自己安装系统的云服务器地址
  11. 火车票售票系统mysql_2021年元旦火车票今日开售!具体开售时间是几点?
  12. 敏捷无敌(13)之兵不厌诈
  13. android 自定义曲线图,Android自定义View——贝赛尔曲线
  14. 设z服从标准正态分布_设Z服从标准正态分布,则P(Z1.33)=
  15. 江宁地区吃喝玩乐全攻略!
  16. java mail 匿名_java开发邮件发送匿名
  17. 教你在五分钟构建一个App页面
  18. Vue源码学习 -- 响应式原理之观察者模式
  19. 测试开发(社招)面经:度小满
  20. 编制项目预算的方法和步骤

热门文章

  1. 音乐歌单Android,[CloudReader]Android - 仿网易云音乐歌单详情页
  2. 正确理解差异的“专业意义”与“统计学意义”
  3. 计算机硬盘显示容量,求解怎么增加电脑硬盘容量
  4. 2020年代,中国AI创业公司将走向何方
  5. 设计模式之模板方法模式详解
  6. filezilla定时上传_windows下定时利用bat脚本实现ftp上传和下载
  7. 工控液晶屏开机白屏怎么回事,开机白屏解决方法?
  8. 我是个28岁的IT,我现在慌得一比
  9. Java并发之魂——synchronized深度解析
  10. 内存不能读写问题解决方案