你们好,这是系列博文的第一篇: 系列博文会完成如下功能:java
一. 地图篇:利用高德SDK实现滴滴出行的效果android
二. 导航篇:利用高德SDK实现滴滴司机端的效果(自定义导航界面)git
如今的地图的使用在各类app上不少了,例如: 滴滴出行,摩拜单车等等。地图上的需求你也许会遇到, 我用高德地图两年了,相信我 必定可让你的地图开发之旅少遇到些bug。api
首先咱们访问高德开发平台下载 SDK安全
下载地址 lbs.amap.com/api/android…服务器
由于咱们之后要使用markdown
地图,导航,定位,逆地理编码(搜索功能SDK) 请选择这些下载 上图已经选好了。网络
虽然用的高德6.0来演示的可是因为
高德SDK6.0的版本有崩溃的bug问题(只有导航SDK6.0有)
因此我用的是一个老的版原本开发的
这里说明一下,避免引发你们的误会,旧SDK在代码里面
复制代码
咱们新建一个Android工程。以下:app
建好之后 咱们在这个工程上创建一个Module 请选择Android Library取名AmapLibrarysocket
请选择Android Library 咱们把高德SDK放在这个Library中
是为了之后方便移植。还要不少有优势。等会我跟你们说。
好了。 咱们的app工程和Library都弄好了。
解压你刚下载的高德SDK 解压后文件夹以下:
下面虽然用的高德6.0来演示的可是因为
高德SDK6.0的版本有崩溃的bug问题(只有导航SDK6.0有)
因此我用的是一个老的版原本开发的
这里说明一下,避免引发你们的误会,旧SDK在代码里面
复制代码
拷贝这两个文件到AmapLibrary中libs目录下
以下:
而后须要在 AmapLibrary和app的build.gradle中都添加 添加在build.gradle文件下的
android标签下 以下:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
复制代码
添加这个是由于 咱们把armeabi库放在libs下面
而后在defaultConfig标签下添加
ndk {
abiFilters 'armeabi'
}
复制代码
build.gradle以下:
请注意app下的build.gradle也要添加
而后请将AmapLibrary中build.gradle中的
implementation fileTree(include: ['*.jar'], dir: 'libs')
复制代码
替换成
compile fileTree(include: ['*.jar'], dir: 'libs')
复制代码
这样app才能使用AmapLibrary工程中的libs库(很是重要)
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
复制代码
在AmapLibrary工程下的AndroidManifest.xml文件
请注意咱们只须要在AmapLibrary工程下的AndroidManifest.xml文件添加
没必要在app工程下的AndroidManifest.xml文件下添加(由于打包的时候这些东西都会自动打包到一个AndroidManifest.xml文件中)
AmapLibrary的AndroidManifest.xml以下
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yisingle.amap.lib" >
<!--地图须要的权限-->
<!--容许程序打开网络套接字-->
<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" />
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!--用于申请调用A-GPS模块-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!--用于申请获取蓝牙信息进行室内定位-->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!--这个权限用于容许程序在手机屏幕关闭后后台进程仍然运行-->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application>
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="须要在高德开放平台上申请" />
</application>
</manifest>
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="须要在高德开放平台上申请" />
这个东西须要到高德开放平台申请。接下咱们完成这个工做就集成好的高德SDK了
复制代码
申请高德SDK的apikey 须要两个关键的东西。
在这个工程中 请注意咱们拿app的包名 而不是AmapLirary的包名(谨记)
app的包名是:com.yisingle.study.map.one
以下图:
以下图:
在AndroidStudio中点击Build generate singed apk 生成签名
而后点击下一步 出现以下图:
点击ok
生成好了
在工程中建一个文件夹取名key 并把签名文件放到里面以下图:
而后在app中的build.gradle中 配置打包使用生成的签名。
在app.的build.gradle文件下 android标签下 添加
signingConfigs {
signinfo {
keyAlias 'key0'
keyPassword '123456789'
storeFile file('../key/studyone.jks')
storePassword '123456789'
}
}
复制代码
在buildTypes标签下修改代码以下:
buildTypes {
release {
minifyEnabled false
signingConfig signingConfigs.signinfo
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
signingConfig signingConfigs.signinfo
}
}
复制代码
注意请把signingConfigs 放在 buildTypes的前面。
这样咱们就使用生成的签名打包debug文件了。就是换了电脑工程也不会出现签名不对的问题。
最后app工程下的build.gradle的文件以下:
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.yisingle.study.map.one"
minSdkVersion 18
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk {
abiFilters 'armeabi'
}
}
signingConfigs {
signinfo {
keyAlias 'key0'
keyPassword '123456789'
storeFile file('../key/studyone.jks')
storePassword '123456789'
}
}
buildTypes {
release {
minifyEnabled false
signingConfig signingConfigs.signinfo
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
signingConfig signingConfigs.signinfo
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
复制代码
经过 命令 获取签名文件 命令在window下也能够用哈
复制:
38:86:88:CF:78:05:5C:C4:F5:D5:B4:0A:3C:24:E9:11:3A:58:12:85
上面就是个人签名文件的SHA1
好了
这里我就不详细介绍了 请你们本身看高德开发平台注册流程吧 很简单
进入应用管理界面 点击应用管理 点击建立新应用
而后会弹出下面的界面 随便填写就能够了
建立好后点击添加新Key
而后输入sha1 和包名 点击提交
而后咱们会获得key
填写到AmapLirary工程下的
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="7a91a3b1ccdf395223bcf4f511d5697c" />
复制代码
而后咱们将AmapLibrary工程做为app的库导入 这样操做
在app工程的build.gradle 中添加
implementation project(':AmapLibrary')
复制代码
好了咱们来验证一下是否配置成功了。
在app的MainActivity界面写以下的代码
package com.yisingle.study.map.one;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.route.BusRouteResult;
import com.amap.api.services.route.DriveRouteResult;
import com.amap.api.services.route.RideRouteResult;
import com.amap.api.services.route.RouteSearch;
import com.amap.api.services.route.WalkRouteResult;
import com.yisingle.amap.lib.GaoDeErrorUtils;
public class MainActivity extends AppCompatActivity {
private RouteSearch routeSearch;
private TextView tvInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvInfo = findViewById(R.id.tvInfo);
routeSearch = new RouteSearch(this);
routeSearch.setRouteSearchListener(new RouteSearch.OnRouteSearchListener() {
@Override
public void onBusRouteSearched(BusRouteResult busRouteResult, int i) {
}
@Override
public void onDriveRouteSearched(DriveRouteResult driveRouteResult, int i) {
//验证是否成功
tvInfo.setText(GaoDeErrorUtils.getErrorInfo(i));
}
@Override
public void onWalkRouteSearched(WalkRouteResult walkRouteResult, int i) {
}
@Override
public void onRideRouteSearched(RideRouteResult rideRouteResult, int i) {
}
});
startConfimGaode();
}
public void startConfimGaode() {
LatLonPoint from = new LatLonPoint(30.537107, 104.06951);
LatLonPoint to = new LatLonPoint(30.657349, 104.065837);
RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(from, to);
RouteSearch.DriveRouteQuery query = new RouteSearch.DriveRouteQuery(fromAndTo, RouteSearch.DRIVING_SINGLE_SHORTEST, null, null, "");
routeSearch.calculateDriveRouteAsyn(query);
tvInfo.setText("使用地图的路径规划中");
}
@Override
protected void onDestroy() {
super.onDestroy();
}
public void test(View view) {
startConfimGaode();
}
}
package com.yisingle.amap.lib;
import java.util.HashMap;
/**
* @author jikun
* Created by jikun on 2018/3/8.
*/
//http://lbs.amap.com/api/android-sdk/guide/map-tools/error-code/ 错误码对照表
public class GaoDeErrorUtils {
private static HashMap<Integer, String> errorMAP = new HashMap<>();
static {
errorMAP.put(1000, "请求正常" + "服务调用正常,有结果返回");
errorMAP.put(1001, "开发者签名未经过");
errorMAP.put(1002, "用户Key不正确或过时");
errorMAP.put(1003, "没有权限使用相应的接口");
errorMAP.put(1008, "MD5安全码未经过验证");
errorMAP.put(1009, "请求Key与绑定平台不符");
errorMAP.put(1012, "权限不足,服务请求被拒绝");
errorMAP.put(1013, "该Key被删除");
errorMAP.put(1100, "引擎服务响应错误");
errorMAP.put(1101, "引擎返回数据异常");
errorMAP.put(1102, "高德服务端请求连接超时");
errorMAP.put(1103, "读取服务结果返回超时");
errorMAP.put(1200, "请求参数非法");
errorMAP.put(1201, "请求条件中,缺乏必填参数");
errorMAP.put(1202, "服务请求协议非法");
errorMAP.put(1203, "服务端未知错误");
errorMAP.put(1800, "服务端新增错误");
errorMAP.put(1801, "协议解析错误");
errorMAP.put(1802, "socket 链接超时 - SocketTimeoutException");
errorMAP.put(1803, "url异常 - MalformedURLException");
errorMAP.put(1804, "未知主机 - UnKnowHostException");
errorMAP.put(1806, "http或socket链接失败 - ConnectionException");
errorMAP.put(1900, "未知错误");
errorMAP.put(1901, "参数无效");
errorMAP.put(1902, "IO 操做异常 - IOException");
errorMAP.put(1903, "空指针异常 - NullPointException");
errorMAP.put(2000, "Tableid格式不正确");
errorMAP.put(2001, "数据ID不存在");
errorMAP.put(2002, "云检索服务器维护中");
errorMAP.put(2003, "Key对应的tableID不存在");
errorMAP.put(2100, "找不到对应的userid信息");
errorMAP.put(2101, "App Key未开通“附近”功能");
errorMAP.put(2200, "在开启自动上传功能的同时对表进行清除或者开启单点上传的功能");
errorMAP.put(2201, "USERID非法");
errorMAP.put(2202, "NearbyInfo对象为空");
errorMAP.put(2203, "两次单次上传的间隔低于7秒");
errorMAP.put(2204, "Point为空,或与前次上传的相同");
errorMAP.put(3000, "规划点(包括起点、终点、途经点)不在中国陆地范围内");
errorMAP.put(3001, "规划点(包括起点、终点、途经点)附近搜不到路");
errorMAP.put(3002, "路线计算失败,一般是因为道路连通关系致使");
errorMAP.put(3003, "步行算路起点、终点距离过长致使算路失败。");
errorMAP.put(4000, "短串分享认证失败");
errorMAP.put(4001, "短串请求失败");
}
public static String getErrorInfo(int code) {
if (null != errorMAP.get(code)) {
return errorMAP.get(code);
} else {
return "未知错误";
}
}
}
复制代码
好了 若是显示请求正常服务调用正常,有结果返回 code 为1000那么 就表明咱们集成成功了。
上面代码的下载地址: