有關Cocos項目裏面接入高德SDK的方式

1.有關高德開放平臺的審覈工作


首先就是要註冊賬號,分爲個人開發者和企業開發者兩種身份,企業開發者審覈期爲三天,權限和服務也會更多。然後創建自己的應用,填寫信息,如下:

有關SHA1等信息可以在項目裏面查看:

點擊Preferences

這裏有兩個keystore,一個是debug版本的,另一個是release版本的,有關keystore文件的生成請點擊:傳送門
然後把release的keystore信息填寫到高德上就可以得到一個key值了。接下來就是要寫代碼了


2.項目配置


添加jar包
從官網上面下載jar包等開發工具,然後導入到項目的libs文件夾下面(eclipse),然後右擊,如圖所示:


接下來需要配置AndroidManifest.xml文件。

爲了保證高德 Android SDK 的功能正常使用,您需要申請高德 Key 並且配置到項目中。

項目的 “AndroidManifest.xml” 文件中,添加如下代碼:

[java] view plain copy
 print?
  1. <application  
  2.          android:icon="@drawable/icon"  
  3.          android:label="@string/app_name" >  
  4.          <meta-data  
  5.             android:name="com.amap.api.v2.apikey"  
  6.             android:value="請輸入您的用戶Key"/>  
  7.             ……  
  8. </application>  

首先,聲明Service組件

請在application標籤中聲明service組件,每個app擁有自己單獨的定位service。

1
<service android:name="com.amap.api.location.APSService"></service>

然後,聲明權限

Android 6.0及以上系統可以參考Android 6.0權限說明章節

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!--用於進行網絡定位-->
<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>

接下來需要在org.cocos2dx.lua.AppActivity裏面添加初始代碼(由於這是一個獲取位置的小Demo,目前只有滿足需求的部分代碼,後續增加功能的話,其餘功能代碼會陸續加上來)

先貼上代碼:
[java] view plain copy
 print?
  1. /**************************************************************************** 
  2. Copyright (c) 2008-2010 Ricardo Quesada 
  3. Copyright (c) 2010-2012 cocos2d-x.org 
  4. Copyright (c) 2011      Zynga Inc. 
  5. Copyright (c) 2013-2014 Chukong Technologies Inc. 
  6.   
  7. http://www.cocos2d-x.org 
  8.  
  9. Permission is hereby granted, free of charge, to any person obtaining a copy 
  10. of this software and associated documentation files (the "Software"), to deal 
  11. in the Software without restriction, including without limitation the rights 
  12. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
  13. copies of the Software, and to permit persons to whom the Software is 
  14. furnished to do so, subject to the following conditions: 
  15.  
  16. The above copyright notice and this permission notice shall be included in 
  17. all copies or substantial portions of the Software. 
  18.  
  19. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
  20. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
  21. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
  22. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
  23. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
  24. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
  25. THE SOFTWARE. 
  26. ****************************************************************************/  
  27. package org.cocos2dx.lua;  
  28.   
  29. import org.cocos2dx.lib.Cocos2dxActivity;  
  30. import android.os.Bundle;  
  31. import android.util.Log;  
  32. import android.content.Intent;  
  33.   
  34. import com.amap.api.location.AMapLocation;  
  35. import com.amap.api.location.AMapLocationClient;  
  36. import com.amap.api.location.AMapLocationClientOption;  
  37. import com.amap.api.location.AMapLocationClientOption.AMapLocationMode;  
  38. import com.amap.api.location.AMapLocationClientOption.AMapLocationProtocol;  
  39. import com.amap.api.location.AMapLocationListener;  
  40. import com.anysdk.framework.PluginWrapper;  
  41.   
  42. public class AppActivity extends Cocos2dxActivity {  
  43.   
  44.   
  45.     private AMapLocationClient locationClient = null;  
  46.     private AMapLocationClientOption locationOption = new AMapLocationClientOption();  
  47.     private String LocationInfo;   
  48.     @Override  
  49.     protected void onCreate(Bundle savedInstanceState) {  
  50.         super.onCreate(savedInstanceState);  
  51.   
  52.         initLocation();  
  53.         //for anysdk  
  54.         PluginWrapper.init(this);  
  55.     }  
  56.       
  57.     public String GetInfo()  
  58.     {  
  59.         return LocationInfo;  
  60.     }  
  61.       
  62.     /** 
  63.      * 初始化定位 
  64.      */  
  65.     private void initLocation(){  
  66.         //初始化client  
  67.         locationClient = new AMapLocationClient(this.getApplicationContext());  
  68.         //設置定位參數  
  69.         locationClient.setLocationOption(getDefaultOption());  
  70.         // 設置定位監聽  
  71.         locationClient.setLocationListener(locationListener);  
  72.         //啓動定位  
  73.         locationClient.startLocation();  
  74.     }  
  75.       
  76.     AMapLocationListener locationListener = new AMapLocationListener() {  
  77.         @Override  
  78.         public void onLocationChanged(AMapLocation location) {  
  79.             if (location != null) {  
  80.                 if (location.getErrorCode() == 0) {  
  81.                     StringBuffer sb = new StringBuffer(256);  
  82.                     sb.append("時間: ");  
  83.                     sb.append(location.getTime());  
  84.                     sb.append("\n緯度:");  
  85.                     sb.append(location.getLatitude());  
  86.                     sb.append("\n緯度:");  
  87.                     sb.append(location.getLongitude());  
  88.                     sb.append("\n精度:");  
  89.                     sb.append(location.getAccuracy());  
  90.                     sb.append("\n地址:");  
  91.                     sb.append(location.getAddress());  
  92.                     sb.append("\n國家信息:");  
  93.                     sb.append(location.getCountry());  
  94.                     sb.append("\n省信息:");  
  95.                     sb.append(location.getProvince());  
  96.                     sb.append("\n城市信息:");  
  97.                     sb.append(location.getCity());  
  98.                     sb.append("\n城區信息:");  
  99.                     sb.append(location.getDistrict());  
  100.                     sb.append("\n街道信息:");  
  101.                     sb.append(location.getStreet());  
  102.                     sb.append("\n街道門牌號信息:");  
  103.                     sb.append(location.getStreetNum());  
  104.                     sb.append("\n城市編碼:");  
  105.                     sb.append(location.getCityCode());  
  106.                     sb.append("\n地區編碼:");  
  107.                     sb.append(location.getAdCode());  
  108.                     sb.append("\n定位點AOI信息:");  
  109.                     sb.append(location.getAoiName());  
  110.                     LocationInfo = sb.toString();  
  111.                     Log.d("LOC", LocationInfo);  
  112.                 }else {  
  113.                 //定位失敗時,可通過ErrCode(錯誤碼)信息來確定失敗的原因,errInfo是錯誤信息,詳見錯誤碼錶。  
  114.                 Log.e("AmapError","location Error, ErrCode:"  
  115.                     + location.getErrorCode() + ", errInfo:"  
  116.                     + location.getErrorInfo());  
  117.                 }  
  118.             }  
  119.         }  
  120.     };  
  121.       
  122.     /** 
  123.      * 默認的定位參數 
  124.      */  
  125.     private AMapLocationClientOption getDefaultOption(){  
  126.         AMapLocationClientOption mOption = new AMapLocationClientOption();  
  127.         mOption.setLocationMode(AMapLocationMode.Hight_Accuracy);//可選,設置定位模式,可選的模式有高精度、僅設備、僅網絡。默認爲高精度模式  
  128.         mOption.setGpsFirst(false);//可選,設置是否gps優先,只在高精度模式下有效。默認關閉  
  129.         mOption.setHttpTimeOut(30000);//可選,設置網絡請求超時時間。默認爲30秒。在僅設備模式下無效  
  130.         mOption.setInterval(2000);//可選,設置定位間隔。默認爲2秒  
  131.         mOption.setNeedAddress(true);//可選,設置是否返回逆地理地址信息。默認是true  
  132.         mOption.setOnceLocation(false);//可選,設置是否單次定位。默認是false  
  133.         mOption.setOnceLocationLatest(false);//可選,設置是否等待wifi刷新,默認爲false.如果設置爲true,會自動變爲單次定位,持續定位時不要使用  
  134.         AMapLocationClientOption.setLocationProtocol(AMapLocationProtocol.HTTP);//可選, 設置網絡請求的協議。可選HTTP或者HTTPS。默認爲HTTP  
  135.         mOption.setSensorEnable(false);//可選,設置是否使用傳感器。默認是false  
  136.         mOption.setWifiScan(true); //可選,設置是否開啓wifi掃描。默認爲true,如果設置爲false會同時停止主動刷新,停止以後完全依賴於系統刷新,定位位置可能存在誤差  
  137.         mOption.setLocationCacheEnable(true); //可選,設置是否使用緩存定位,默認爲true  
  138.         return mOption;  
  139.     }  
  140.       
  141.       
  142.     @Override  
  143.     protected void onActivityResult(int requestCode, int resultCode, Intent data){  
  144.         super.onActivityResult(requestCode, resultCode, data);  
  145.         PluginWrapper.onActivityResult(requestCode, resultCode, data);  
  146.     }  
  147.     @Override  
  148.     protected void onResume() {  
  149.         super.onResume();  
  150.         PluginWrapper.onResume();  
  151.     }  
  152.     @Override  
  153.     public void onPause(){  
  154.         PluginWrapper.onPause();  
  155.         super.onPause();  
  156.     }  
  157.     @Override  
  158.     protected void onNewIntent(Intent intent) {  
  159.         PluginWrapper.onNewIntent(intent);  
  160.         super.onNewIntent(intent);  
  161.     }  
  162. }  

[java] view plain copy
 print?
  1. <span style="white-space:pre">  </span>private AMapLocationClient locationClient = null;//<span style="color: rgb(0, 131, 18); font-family: Menlo, Consolas, monospace; white-space: nowrap;">聲明AMapLocationClient類對象</span>  
  2.     private AMapLocationClientOption locationOption = new AMapLocationClientOption();//<span style="color: rgb(0, 131, 18); font-family: Menlo, Consolas, monospace; white-space: nowrap;">聲明並初始化AMapLocationClientOption對象</span>  
  3.     private String LocationInfo;//保存獲取到的地址信息  

下面是有關定位模式的信息:

選擇定位模式

高德定位服務包含GPS和網絡定位(Wi-Fi和基站定位)兩種能力。定位SDK將GPS、網絡定位能力進行了封裝,以三種定位模式對外開放,SDK默認選擇使用高精度定位模式。

高精度定位模式:會同時使用網絡定位和GPS定位,優先返回最高精度的定位結果,以及對應的地址描述信息。

1
2
//設置定位模式爲AMapLocationMode.Hight_Accuracy,高精度模式。
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);

低功耗定位模式:不會使用GPS和其他傳感器,只會使用網絡定位(Wi-Fi和基站定位);

1
2
//設置定位模式爲AMapLocationMode.Battery_Saving,低功耗模式。
mLocationOption.setLocationMode(AMapLocationMode.Battery_Saving);

僅用設備定位模式:不需要連接網絡,只使用GPS進行定位,這種模式下不支持室內環境的定位,自 v2.9.0 版本支持返回地址描述信息。

1
2
//設置定位模式爲AMapLocationMode.Device_Sensors,僅設備模式。
mLocationOption.setLocationMode(AMapLocationMode.Device_Sensors);

設置單次定位

如果您需要使用單次定位,需要進行如下設置:

1
2
3
4
5
6
7
8
9
//獲取一次定位結果:
//該方法默認爲false。
mLocationOption.setOnceLocation(true);
 
//獲取最近3s內精度最高的一次定位結果:
//設置setOnceLocationLatest(boolean b)接口爲true,啓動定位時SDK會返回最近3s內精度最高的一次定位結果。如果設置其爲true,setOnceLocation(boolean b)接口也會被設置爲true,反之不會,默認爲false。
mLocationOption.setOnceLocationLatest(true);
 
}

自定義連續定位

SDK默認採用連續定位模式,時間間隔2000ms。如果您需要自定義調用間隔:

1
2
//設置定位間隔,單位毫秒,默認爲2000ms,最低1000ms。
mLocationOption.setInterval(1000);

其他參數

設置定位同時是否需要返回地址描述。

1
2
//設置是否返回地址信息(默認返回地址信息)
mLocationOption.setNeedAddress(true);

設置是否強制刷新WIFI,默認爲強制刷新。每次定位主動刷新WIFI模塊會提升WIFI定位精度,但相應的會多付出一些電量消耗。

1
2
//設置是否強制刷新WIFI,默認爲true,強制刷新。
mLocationOption.setWifiActiveScan(false);

設置是否允許模擬軟件Mock位置結果,多爲模擬GPS定位結果,默認爲false,不允許模擬位置。

1
2
//設置是否允許模擬位置,默認爲false,不允許模擬位置
mLocationOption.setMockEnable(false);

設置定位請求超時時間,默認爲30秒。

注意:自 V3.1.0 版本之後setHttpTimeOut(long httpTimeOut)方法不僅會限制低功耗定位、高精度定位兩種模式的定位超時時間,同樣會作用在僅設備定位時。如果單次定位發生超時情況,定位隨即終止;連續定位狀態下當前這一次定位會返回超時,但按照既定週期的定位請求會繼續發起。

1
2
//單位是毫秒,默認30000毫秒,建議超時時間不要低於8000毫秒。
mLocationOption.setHttpTimeOut(20000);

設置是否開啓定位緩存機制

緩存機制默認開啓,可以通過以下接口進行關閉。

當開啓定位緩存功能,在高精度模式和低功耗模式下進行的網絡定位結果均會生成本地緩存,不區分單次定位還是連續定位。GPS定位結果不會被緩存。

1
2
//關閉緩存機制
mLocationOption.setLocationCacheEnable(false);

啓動定位

1
2
3
4
//給定位客戶端對象設置定位參數
mLocationClient.setLocationOption(mLocationOption);
//啓動定位
mLocationClient.startLocation();


獲取定位結果

AMapLocationListener接口只有onLocationChanged方法可以實現,用於接收異步返回的定位結果,回調參數是AMapLocation。

實現監聽器

1
2
3
4
5
6
7
8
//可以通過類implement方式實現AMapLocationListener接口,也可以通過創造接口類對象的方法實現
//以下爲後者的舉例:
AMapLocationListener mAMapLocationListener = newAMapLocationListener(){
@Override
publicvoid  onLocationChanged(AMapLocation amapLocation) {
     
  }
}

之後在監聽器的回調方法內解析AMapLocation對象。

解析AMapLocation對象

首先,可以判斷AMapLocation對象不爲空,當定位錯誤碼類型爲0時定位成功。

1
2
3
4
5
6
7
8
9
10
if(amapLocation != null) {
    if(amapLocation.getErrorCode() == 0) {
//可在其中解析amapLocation獲取相應內容。
    }else{
    //定位失敗時,可通過ErrCode(錯誤碼)信息來確定失敗的原因,errInfo是錯誤信息,詳見錯誤碼錶。
    Log.e("AmapError","location Error, ErrCode:"
        + amapLocation.getErrorCode() + ", errInfo:"
        + amapLocation.getErrorInfo());
    }
}

當定位成功時,可在如上判斷中解析amapLocation對象的具體字段,參考如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
amapLocation.getLocationType();//獲取當前定位結果來源,如網絡定位結果,詳見定位類型表
amapLocation.getLatitude();//獲取緯度
amapLocation.getLongitude();//獲取經度
amapLocation.getAccuracy();//獲取精度信息
amapLocation.getAddress();//地址,如果option中設置isNeedAddress爲false,則沒有此結果,網絡定位結果中會有地址信息,GPS定位不返回地址信息。
amapLocation.getCountry();//國家信息
amapLocation.getProvince();//省信息
amapLocation.getCity();//城市信息
amapLocation.getDistrict();//城區信息
amapLocation.getStreet();//街道信息
amapLocation.getStreetNum();//街道門牌號信息
amapLocation.getCityCode();//城市編碼
amapLocation.getAdCode();//地區編碼
amapLocation.getAoiName();//獲取當前定位點的AOI信息
amapLocation.getBuildingId();//獲取當前室內定位的建築物Id
amapLocation.getFloor();//獲取當前室內定位的樓層
amapLocation.getGpsStatus();//獲取GPS的當前狀態
//獲取定位時間
SimpleDateFormat df = newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = newDate(amapLocation.getTime());
df.format(date);

最後一步,停止定位

停止定位

1
mLocationClient.stopLocation();//停止定位後,本地定位服務並不會被銷燬

銷燬定位客戶端

銷燬定位客戶端之後,若要重新開啓定位請重新New一個AMapLocationClient對象。

1
mLocationClient.onDestroy();//銷燬定位客戶端,同時銷燬本地定位服務。

獲取的結果如下:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章