之前在做大创的时候,就用到了高德地图,但是当时是为了赶项目,所以只是按照官方的demo代码搬运了过来,而具体哪个类是干什么的根本不清楚,而且一个完整的流程也是很模糊。现在再次用到了这个东西,所以觉得一定要好好研究一下,为了以后用的更方便,总不能每次都搬运人家官方的demo吧-。=。
今天这篇是最基础的一篇,我会从申请高德API的key开始走一遍流程,因为相信大家跟我一样,看官网给的代码都已经晕头转向了(他写的实在是太乱了)。
接下来我们按照申请的流程一步一步的实现高德地图的API使用:
一、申请和配置
首先来看一下申请和配置的流程:
1、申请注册成为开发者。
这一步应该不用怎么说吧,大家自己都会注册账号密码什么的。。
2、申请应用key
①首先点开控制台,点击应用管理:
我这里已经有了四个应用,如果是刚刚创建的话是没有的。
②点击右上角创建应用:
应用名称随便填,应用类型也随便填。点击创建
我们创建好了之后会在应用中显示刚刚创建和已经创建的应用。
③点击右上角添加新Key
我们只说一下获取这两个安全码SHA1:
2.1.调试版:我们打开Android Studio,点击gradle projects(默认在右侧),app->Tasks->android->signingReport。
双击后,他会给我们调试版的安全码SHA1。这个测试版的安全码我们就可以填入了。
2.2.发布版:这个需要我们找到自己的签名证书文件,如果没有的话,下面笔者带着大家申请一个:
- 申请签名证书文件
- 打开终端或者Terminal,获取正式版安全码SHA1。
2.2.1申请签名证书文件:
关于申请签名证书文件的方式有很多,可以通过终端,也可以通过Android Studio,个人比较喜欢用Android Studio(可能是因为比较懒吧-。+!!)。
点击Generate Signed APK 。
他会出现一个这样的界面。在第一行中的Key Store path中指定我们签名文件的路径,如果没有的话点击Create new...
随便填,只要你能记得住就行,Validity为签名文件有效时间,当然我们肯定用不了这么长时间的。点击ok。
然后退出Generate signed APK,因为我们只是为了生成一个签名证书文件,又不是发布正式版的APK。
2.2.2打开终端或者Terminal。
推荐大家使用Terminal,因为Android Studio已经集成了,用起来比较方便(本人就是懒-。+)。
首先要移动到我们刚刚生成的签名证书文件的路径下。
然后输入以下代码:
keytool -list -v -keystore 这是我们刚刚创建的签名证书文件的名字
点击enter,
他会出现让我们输入密匙口令,这个就是我们刚才创建签名文件的时候自己设置的。
现在我们就获取到正式版的SHA1安全码了。
现在我们将测试安全码和正式安全码填入,下面的包名我们在AndroidManifest.xml中自己就可以查找。不多说。
我们看到现在已经应用中已经有了key。
3、在Project中添加配置。
我们从官方下载的SDK解压后如下:
我下的是6.3.0的版本:
3.1.导入jar包。
3.1.1.我们将里面的jar包放入app/libs文件目录下。
因为我已经导入了,在大家那里应该是看不到jar包前面的这个小箭头的。
3.1.2.导入jar包
导入jar包的方式有两种:
一种是最暴力的,直接点击File->Sync Project with Gradle Files ,将所有libs目录下的jar包全部导入。
另一种是我们选择将哪个jar包导入。File->Project Structure ->Dependencies -> + ->Jar dependency->找到自己Application Project的路径,->libs中选择自己想要导入的jar包。
个人觉得还是第二中比较好,因为不必要的jar包导入让整个app看着很胖。
3.2.放入.so文件
放入.so文件同样有两种方式:使用默认配置(不修改build.gradle)和修改build.gradle配置。
使用默认配置:将解压缩剩下的(除了jar包)的文件夹放入src/main/jniLibs文件夹下(没有自己创建,在几版本的Android Studio中我记得添加jni就会自动创建这个目录)
修改build.gradle:将文件夹放入刚才的app/libs目录。然后打开build.gradle。
在android下添加如下标签:
android { compileSdkVersion 26 defaultConfig { ...... /*sourceSets{ main{ jniLibs.srcDirs = ['libs'] } }*/ } ...... }
注释掉的部分,因为本人比较懒,所以用的默认配置-。+。
3.3.在AndroidManifest.xml中进行配置。
3.3.1.权限声明
我们开发肯定需要一系列权限的声明(我直接打出来了,大家复制粘贴吧23333):
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <!--用于访问GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <!--获取运营商信息,用于支持提供运营商信息相关的接口--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <!--用于访问wifi网络信息,wifi信息会用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <!--用于访问网络,网络定位需要上网--> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <!--用于读取手机当前的状态--> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <!--用于申请调用A-GPS模块--> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission> <!--用于申请获取蓝牙信息进行室内定位--> <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
3.3.2.在Application标签中加入 meta-data标签
<meta-data android:name="com.amap.api.v2.apikey" android:value="07e23534b69a1ea1dd7b17cc2812142c" />
其中name一定要这样写,value就是我们刚才申请的key。
3.3.3.声明Service组件
<service android:name="com.amap.api.location.APSService"/>
到现在为止我们申请和配置的工作就做完了(感觉也不是很多是吧!)
二、显示地图
由于篇幅的原因,我们今天只看一下如何显示地图以及显示定位蓝点。
1、在layout中添加地图容器。
这个是一个很没有操作的事情,我们默认一般都使用mapview,官方还提供了6中容器用来显示地图。
<com.amap.api.maps.MapView android:id="@+id/map" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" />
2、使用AMap类。
这个AMap类可以说是一个很重要的类,他是地图的控制器类,主要负责的工作有:
- 地图模式切换(黑夜、卫星......)
- 改变地图状态(旋转角度、俯仰角、中心坐标、缩放级别等)
- 添加标记点(Marker)
- 绘制几何图形(Polyline、Polyon、Circle等)
- 事件监听(点击、手势)
下面我们一起看一下AMap类的主要方法:
限定符 |
返回值 |
方法名 |
介绍 |
字段 |
public final |
void |
setMapType(int) |
设置地图模式 |
MAP_TYPE_NORMAL 普通 MAP_TYPE_SATELLITE 卫星 MAP_TYPE_NIGHT 夜间 MAP_TYPE_NAVI 导航 MAP_TYPE_BUS 公交 |
public final |
int |
getMapType() |
获取地图模式 |
|
public final |
UiSettings |
getUiSettings() |
获取地图UI控制器 |
|
public final |
void |
setMylocationStyle(MyLocationStye) |
设置定位小蓝点(坐标位置) |
|
public final |
void |
setMylocationEnabled(boolean) |
设置是否启动定位蓝点 |
true:启动显示 false:隐藏定位蓝点,并不定位 默认false |
public final |
void |
setTrafficEnabled(boolean) |
设置是否打开交通图层 |
true:打开 false:不打开 默认true |
public final |
boolean |
isTrafficEnabled() |
获取是否已打开交通图层 |
|
public final |
void |
showMapText(boolean) |
设置是否打开文字标注 |
默认true |
public final |
void |
showIndoorMap(boolean) |
设置是否显示室内地图 |
默认false |
public final |
void |
showBuildings(boolean) |
设置是否显示3D建筑 |
默认true |
这里面涉及到两个其他的类:MyLocationStyle类和UiSettings类。我们今天主要看一下MyLocationStyle类:
3、MyLocationStyle类介绍
MyLocationStyle类为定位小蓝点的绘制样类。方法如下:
限定符 |
返回值 |
方法名 |
介绍 |
字段 |
public |
MyLocationStyle |
myLocationIcon(BitmapPescriptor) |
设置定位蓝点的图标 |
|
public |
MyLocationStyle |
anchor(float u,float v) |
设置定位图标锚点的偏移量 |
|
public |
MyLocationStyle |
radiusFillColor(int color) |
设置圆形区域的填充颜色 |
|
public |
MyLocationStyle |
strokeColor(int color) |
设置圆形区域的边框颜色 |
|
public |
MyLocationStyle |
strokeWidth(float width) |
设置圆形区域的边框宽度 |
|
public |
MyLocationStyle |
inteval(long interval) |
设置连续定位请求间隔 |
|
public |
MyLocationStyle |
showMyLocation(boolean visible) |
是否显示蓝点图标 |
默认true,false情况会定位,但是图标不显示 |
public |
MyLocationStyle |
myLocationType(int type) |
设置位置展示模式 |
_SHOW 只定位一次 _LOCAE 只定位一次,且将视角移动到地图中心点 _FOLLOW 连续定位,将视角移动到中心点,定位蓝点随设备移动。 _MAP_ROTATE 连续、视角移动到中心点,地图依照设备防线旋转,定位点随设备移动 _LOCATON_ROTATE 连续、视角移动到中心点,定位点照地图方向旋转,跟设备移动。 _LOCATION_ROTATE_NO_CENTER _MAP_ROTATE_NO_CENTER _FOLLOW_NO_CENTER 后面这三个对应上面的三个,只是不一定到地图中心点 |
可以看出MyLocationStyle是支持链式编写。
有了上面的这些方法介绍,相信大家已经知道如何去显示一个地图了,下面直接给大家带来一个代码栗子了:
private void initMap(Bundle savedInstanceState) { location = (TextView) findViewById(R.id.sample_text); location.setText(stringFromJNI()); mapView = (MapView) findViewById(R.id.map); mapView.onCreate(savedInstanceState); if (aMap == null) { aMap = mapView.getMap(); //获取到aMap实例,从地图容器中获取 } MyLocationStyle myLocationStyle; myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类 myLocationStyle.radiusFillColor(getColor(R.color.colorAlphaRed));//设置圆形区域填充颜色为红色 myLocationStyle.interval(5000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效 myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_MAP_ROTATE_NO_CENTER);//连续定位、蓝点不会移动到地图中心点,地图依照设备方向旋转,并且蓝点会跟随设备移动。 aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style aMap.getUiSettings().setMyLocationButtonEnabled(true); //设置默认定位按钮是否显示,非必需设置。 aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点, aMap.showIndoorMap(true);//室内定位开启 aMap.setMapType(AMap.MAP_TYPE_NIGHT);//地图类型设为夜晚 }
效果如下:
由于模拟器无法实现地图定位,所以只能用真机截个图了!!!
好了,关于高德地图初次使用就到这里了,下一篇中会给大家介绍如何实现定位功能。
喜欢的朋友,如果感觉对你有所帮助的话,希望支持关注一波!!!