Android高德SDK 地圖篇一:集成高德SDK

你們好,這是系列博文的第一篇:  系列博文會完成如下功能:java

  • 一. 地圖篇:利用高德SDK實現滴滴出行的效果android

  • 二. 導航篇:利用高德SDK實現滴滴司機端的效果(自定義導航界面)git

如今的地圖的使用在各類app上不少了,例如: 滴滴出行,摩拜單車等等。地圖上的需求你也許會遇到, 我用高德地圖兩年了,相信我 必定可讓你的地圖開發之旅少遇到些bug。api

集成高德SDK

首先咱們訪問高德開發平臺下載 SDK安全

下載地址 lbs.amap.com/api/android…服務器

由於咱們之後要使用markdown

地圖,導航,定位,逆地理編碼(搜索功能SDK)  請選擇這些下載  上圖已經選好了。網絡

雖然用的高德6.0來演示的可是因爲
高德SDK6.0的版本有崩潰的bug問題(只有導航SDK6.0有)
因此我用的是一個老的版原本開發的
這裏說明一下,避免引發你們的誤會,舊SDK在代碼裏面
複製代碼

創建工程集成SDK 配置build.gradle文件

咱們新建一個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'
}
複製代碼

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" >

    <!--地圖須要的權限-->
    <!--容許程序打開網絡套接字-->
    <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

申請高德SDK的apikey 須要兩個關鍵的東西。

  1. 一個是應用的包名
  2. 一個是應用的打包簽名文件的sh1

應用的包名:

在這個工程中 請注意咱們拿app的包名 而不是AmapLirary的包名(謹記)

app的包名是:com.yisingle.study.map.one

以下圖:

打包簽名文件的sh1

以下圖: 

在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那麼 就表明咱們集成成功了。

上面代碼的下載地址:

gitee.com/justforgame…

相關文章
相關標籤/搜索