1. 程式人生 > >高德地圖全解析--定位篇

高德地圖全解析--定位篇

之前使用的是百度地圖的定位功能,不知道什麼原因註冊的時候總是失敗,而且JAR和SO的匹配也弄的我十分蛋疼,最後換了最新的JAR和SO依然不好使,回撥函式一直失敗,究竟是為了什麼,我也不知道。反正結果是我醉了ORZ。

但是那條條大陸通羅馬吧,啟用高德定位,這貨好使了,但是,但是,但是,最噁心的是這貨的驗證機制,真尼瑪不想說,特別難弄。日了狗了。這裡面的蛋疼就不說了,但是它也確實是好用的,而且功能比較完善,而且開源這裡支援一下!

以下內容會按照使用流程進行解析只說android studio IDE下怎麼使用
一、和很多國內的開源API一樣當然是註冊一個開發者帳號啦

二、註冊完成之後使用公司或者個人的keystore.jks獲取繫結所要使用的SHA1簽名指紋。
若沒有自己生成成,具體方法,請百度。
這裡的坑不多,主要是開啟jsk
產看jsk的方法是在DOS介面在存放key.store的地址使用命令
keytool -list -keystore yourkeystore.jks
就可以在命令列裡看到相應的SHA1串。一共20對,複製的時候一定要注意別複製少了,在複製完成之後務必對照一遍,因為就整個高德地圖來說這個是最噁心的,必須簽名,否則定位不好使。

三、下載定位包,這裡推薦新手下載API和DEMO,如果是有經驗的可以直接上API。

四、有了API之後,解壓,複製到專案的libs目錄下面,然後專案管理,新增依賴,就這麼簡單。檢視是否新增成功可以在build,gradle裡檢視是否產生裡依賴。

五、由於定位大多數的時候是在Service佔用執行的,所以我們當然也要新增高德自己的定位服務,(這步要在依賴之後新增)。其操作為在AndroidManifest.xml中新增高德的後臺服務

六、宣告許可權 主要有一下許可權

<!--用於進行網路定位-->
<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> 注:許可權可以重複所以不必一個一個去看有沒有 直接追加進去即可。

七、也是最重要的一步新增自己的開發者KEY
//開發者申請的key

那麼如何獲得該KEY那,在我們註冊的時候就是為了獲取該KEY做的準備。
1.點選右上角開發者資訊->左上角 我的應用
2.然後右上角建立新應用 名字隨意
3.新增新的KEY
這裡寫圖片描述

這裡注意key名稱自定義沒問題,服務平臺選擇Android平臺SDK
然後填寫釋出版安全碼SHA1就是之前讓大家獲取的SHA1,千萬別寫錯,然後看看有沒有什麼空格什麼的,Package 可以在AndroidManifest裡面進行檢視。

新增完成之後,就可以獲得自己的開發者key了。

八、最後設定自己的application Key
//開發者申請的key

九、也就是最重要的我們來講DEMO這裡直接講混合定位,因為根據Android定位原理,也就是GPS定位和NET定位。即走GPS和網路,而高德的DEMO裡面解直接有混合定位功能,即那個精度高使用那個定位的結果。其介面是這樣的。

這裡寫圖片描述

根據這張圖片我們可以很清楚的知道,我們在service中需要使用的定位模式,如果我們需要實時的進行定位那麼我們就可以檢視持續定位功能,並且設定定位週期(毫秒級且最少1000)。和單次定位功能。

首先我們先從兩者的共性中進行分析即一些引數。

//定位客戶端
private AMapLocationClient locationClient = null;
//定位客戶端配置
private AMapLocationClientOption locationOption = null;

之後在onCreate中進行引數的初始化。

locationClient = new AMapLocationClient(this.getApplicationContext());
        locationOption = new AMapLocationClientOption();
        // 設定定位模式為高精度模式
        locationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
        // 設定定位監聽
        locationClient.setLocationListener(this);

這裡面的四句話第一局是獲得Application以初始化定位客戶端。
第二句是初始化定位引數物件。
第三句是設定定位的模式 高精度模式
第四句是設定定位監聽,即按週期或者單次定位返回資料後回撥的函式,我們也根據這句話獲取需要的相關資訊。

//其型別有省電模式、裝置模式(僅使用GPS定位)、高精度模式
 public static enum AMapLocationMode {
        Battery_Saving, Device_Sensors, Hight_Accuracy;

        private AMapLocationMode() { /* compiled code */ }
    }

十、這些都寫完之後,我們就可以初始化定位配置項,以開始定位了。
在選擇開始定位之後進行的工作
10.1

private void initOption() {
        // 設定是否需要顯示地址資訊
        locationOption.setNeedAddress(cbAddress.isChecked());
        /**
         * 設定是否優先返回GPS定位結果,如果30秒內GPS沒有返回定位結果則進行網路定位
         * 注`這裡寫程式碼片`意:只有在高精度模式下的單次定位有效,其他方式無效
         */
        locationOption.setGpsFirst(cbGpsFirst.isChecked());
        //“設定請求週期” 
        String strInterval = seconds*1000+""if (!TextUtils.isEmpty(strInterval)) {
            // 設定傳送定位請求的時間間隔,最小值為1000,如果小於1000,按照1000算
            locationOption.setInterval(Long.valueOf(strInterval));
        }

    }

10.2 在初始化配置之後將引數交給客戶端 後啟動定位

// 設定定位引數
                locationClient.setLocationOption(locationOption);
                // 啟動定位
                locationClient.startLocation();

對應的停止定位為
locationClient.stopLocation();

十一、在第九步所寫的locationClient.setLocationListener(this);是新增位置返回回撥,其寫法可以參考如下
11.1接入AMapLocationListener 介面 重寫 onLocationChanged方法

 @Override
    public void onLocationChanged(AMapLocation loc) {
        if (null != loc) {
        //其中主要的資訊封裝在loc 中可以常看loc的子方法,獲取想要的引數。
            Message msg = mHandler.obtainMessage();
            msg.obj = loc;
            msg.what = MSG_LOCATION_FINISH;
            latitude=loc.getLatitude()+"";
            longitude=loc.getLongitude()+"";
//使用handler進行資訊回撥處理
            mHandler.sendMessage(msg);
        }
    }

十二、一些引數的設定以及使用以區分到底是GPS優先 單次 或者週期迴圈定位等等
locationOption.setNeedAddress(false);//是否需要返回地址資訊
locationOption.setOnceLocation(false);//是否為一次定位
locationOption.setGpsFirst(true);//是否優先使用GPS進行定位
locationOption.setHttpTimeOut();//設定連線超時時間
等等小夥伴可以根據自己的需求進行發覺,這裡就不再多說了。