Android高德SDK 地圖篇一:集成高德SDK
大家好碰缔,這是系列博文的第一篇: 系列博文會完成以下功能
一. 地圖篇:利用高德SDK實現(xiàn)滴滴出行的效
二. 導航篇:利用高德SDK實現(xiàn)滴滴司機端的效果(自定義導航界面)
集成高德SDK
首先我們訪問高德開發(fā)平臺下載 SDK
下載地址 http://lbs.amap.com/api/android-sdk/download
因為我們以后要使用
地圖,導航,定位,逆地理編碼(搜索功能SDK) 請選擇這些下載 上圖已經(jīng)選好了。
建立工程集成SDK 配置build.gradle文件
我們新建一個Android工程技即。如下:
建好以后 我們在這個工程上建立一個Module 請選擇Android Library取名AmapLibrary
請選擇Android Library 我們把高德SDK放在這個Library中
是為了以后方便移植。還要很多有優(yōu)點。等會我跟大家說
好了。 我們的app工程和Library都弄好了击蹲。
解壓你剛下載的高德SDK 解壓后文件夾如下:
拷貝這兩個文件到AmapLibrary中l(wèi)ibs目錄下
如下:
然后需要在 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')
替換成
api fileTree(include: ['*.jar'], dir: 'libs')
這樣app才能使用AmapLibrary工程中的libs庫(非常重要)
修改后的效果
dependencies {
api 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'
}
AndroidManifest的配置
在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" >
<!--地圖需要的權限-->
<!--允許程序打開網(wǎng)絡套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允許程序設置內(nèi)置sd卡的寫權限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允許程序獲取網(wǎng)絡狀態(tài)-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允許程序訪問WiFi網(wǎng)絡信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允許程序讀寫手機狀態(tài)和身份-->
<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信息會用來進行網(wǎng)絡定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!--用于申請調(diào)用A-GPS模塊-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!--用于申請獲取藍牙信息進行室內(nèi)定位-->
<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
申請高德SDK的apikey 需要兩個關鍵的東西歌豺。
- 一個是應用的包名
- 一個是應用的打包簽名文件的sh1
應用的包名:
在這個工程中 請注意我們拿app的包名 而不是AmapLirary的包名(謹記)
app的包名是:com.yisingle.study.map.one
如下圖:
簽名文件的sh1
如下圖:
在AndroidStudio中點擊Build generate singed apk 生成簽名
然后點擊下一步 出現(xiàn)如下圖:
點擊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文件了世曾。就是換了電腦工程也不會出現(xiàn)簽名不對的問題。
最后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下也可以用哈
keytool -v -list -keystore studyone.jks
復制:
38:86:88:CF:78:05:5C:C4:F5:D5:B4:0A:3C:24:E9:11:3A:58:12:85
上面就是我的簽名文件的SHA1
好了
注冊高德開發(fā)平臺賬號
這里我就不詳細介紹了 請大家自己看高德開發(fā)平臺注冊流程吧 很簡單
進入應用管理界面 點擊應用管理 點擊創(chuàng)建新應用
然后會彈出下面的界面 隨便填寫就可以了
創(chuàng)建好后點擊添加新Key
然后輸入sha1 和包名 點擊提交
然后我們會得到key
填寫到AmapLirary工程下的
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="7a91a3b1ccdf395223bcf4f511d5697c" />
驗證
好了我們來驗證一下是否配置成功了谴咸。
在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("使用地圖的路徑規(guī)劃中");
}
@Override
protected void onDestroy() {
super.onDestroy();
}
public void test(View view) {
startConfimGaode();
}
}
好了 如果顯示請求正常服務調(diào)用正常轮听,有結(jié)果返回 code 為1000那么 就代表我們集成成功了。