CocosCreator接入高德地圖sdk獲取經緯度信息圖文詳解
1.首先去 高德開放平臺.申請key
接下來該獲取發佈版和調試版的SHA1了,首先打開cmd命令窗口
輸入命令:cd .android(首先進入用戶系統的安卓文件夾)
然後輸入命令:keytool -list -v -keystore debug.keystore
然後會提示輸入密碼,輸入:android 然後回車注意:這個時候輸入密碼是不會顯示的,輸入完成以後直接回車就好,這個時候就可以看到這個時候就得到了調試版的SHA1,如下圖
接下來是發佈版的SHA1,我是用的Android studio來獲取的,首先打開Android studio導入打開工程,選擇Build,然後Generate Signed Bundle/APK
然後選擇APK,Next
這個時候我們需要用到的jks文件已經輸出好了,找到剛纔自己定義的輸出文件夾
這個時候再次打開cmd命令臺重複調試版,輸入cd .android進入安卓文件夾,然後輸入命令keytool -list -v -keystore D:\Android\AndroidKey\test.jks(完整版文件路徑),然後輸入密碼:android,然後回車
至此兩個版本的SHA1全部獲取完畢,接下來就是包名,包名就是自己打包apk文件是的包名,然後提交
提交後會得到key,到時配置sdk時會用到,記下來
至此前期全部準備工作全部完畢,接下來該寫代碼了
首先是js客戶端代碼
cc.Class({
extends: cc.Component,
properties: {
label1: cc.Label,
label2: cc.Label,
},
// use this for initialization
onLoad: function () {
this.label1.string = '';
this.label2.string = '';
},
onBtnClick() {
var O = new Object;
if (cc.sys.OS_ANDROID === cc.sys.os) {
O.jingdu = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "getLatitude", "()F");
O.weidu = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "getLongitude", "()F");
}
if (O.jingdu) {
this.label1.string = O.jingdu
this.label2.string = O.weidu
}
},
});
接下來是AppActivity.java原生代碼
package org.cocos2dx.javascript;
import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import android.os.Bundle;
import org.cocos2dx.javascript.SDKWrapper;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.view.WindowManager;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationClientOption.AMapLocationMode;
import com.amap.api.location.AMapLocationClientOption.AMapLocationProtocol;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.location.AMapLocationQualityReport;
import com.amap.api.location.CoordinateConverter;
import com.amap.api.location.CoordinateConverter.CoordType;
import com.amap.api.location.DPoint;
public class AppActivity extends Cocos2dxActivity {
// 聲明AMapLocationClient類對象
private static AMapLocationClient locationClient = null;
private AMapLocationClientOption locationOption = null;
private static float longitude = -1;
private static float latitude = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Workaround in
// https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
if (!isTaskRoot()) {
// Android launched another instance of the root activity into an existing task
// so just quietly finish and go away, dropping the user back into the activity
// at the top of the stack (ie: the last state of this task)
// Don't need to finish it again since it's finished in super.onCreate .
return;
}
SDKWrapper.getInstance().init(this);
// 初始化定位信息
initLocation();
locationClient.startLocation();
}
// 初始化定位
private void initLocation() {
// 初始化client
locationClient = new AMapLocationClient(getApplicationContext());
locationOption = getDefaultOption();
// 設置定位參數
locationClient.setLocationOption(locationOption);
// 設置定位監聽
locationClient.setLocationListener(locationListener);
}
// 默認的定位參數
private AMapLocationClientOption getDefaultOption() {
AMapLocationClientOption mOption = new AMapLocationClientOption();
mOption.setLocationMode(AMapLocationMode.Hight_Accuracy);// 可選,設置定位模式,可選的模式有高精度、僅設備、僅網絡。默認爲高精度模式
mOption.setGpsFirst(true);// 可選,設置是否gps優先,只在高精度模式下有效。默認關閉
mOption.setHttpTimeOut(30000);// 可選,設置網絡請求超時時間。默認爲30秒。在僅設備模式下無效
mOption.setInterval(60000);// 可選,設置定位間隔。默認爲2秒 設置成1分鐘定位一次
mOption.setNeedAddress(true);// 可選,設置是否返回逆地理地址信息。默認是true
mOption.setOnceLocation(false);// 可選,設置是否單次定位。默認是false
mOption.setOnceLocationLatest(false);// 可選,設置是否等待wifi刷新,默認爲false.如果設置爲true,會自動變爲單次定位,持續定位時不要使用
AMapLocationClientOption.setLocationProtocol(AMapLocationProtocol.HTTP);// 可選, 設置網絡請求的協議。可選HTTP或者HTTPS。默認爲HTTP
mOption.setSensorEnable(false);// 可選,設置是否使用傳感器。默認是false
mOption.setWifiScan(true); // 可選,設置是否開啓wifi掃描。默認爲true,如果設置爲false會同時停止主動刷新,停止以後完全依賴於系統刷新,定位位置可能存在誤差
mOption.setLocationCacheEnable(true); // 可選,設置是否使用緩存定位,默認爲true
mOption.setGeoLanguage(AMapLocationClientOption.GeoLanguage.DEFAULT);// 可選,設置逆地理信息的語言,默認值爲默認語言(根據所在地區選擇語言)
return mOption;
}
// 定位監聽
public AMapLocationListener locationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation location) {
if (null != location) {
StringBuffer sb = new StringBuffer();
// errCode等於0代表定位成功,其他的爲定位失敗,具體的可以參照官網定位錯誤碼說明
if (location.getErrorCode() == 0) {
sb.append("定位成功" + "\n");
sb.append("定位類型: " + location.getLocationType() + "\n");
sb.append("經 度 : " + location.getLongitude() + "\n");
sb.append("緯 度 : " + location.getLatitude() + "\n");
// sb.append("精 度 : " + location.getAccuracy() + "米" + "\n");
// sb.append("提供者 : " + location.getProvider() + "\n");
// sb.append("速 度 : " + location.getSpeed() + "米/秒" + "\n");
// sb.append("角 度 : " + location.getBearing() + "\n");
// // 獲取當前提供定位服務的衛星個數
// sb.append("星 數 : " + location.getSatellites() + "\n");
// sb.append("國 家 : " + location.getCountry() + "\n");
// sb.append("省 : " + location.getProvince() + "\n");
// sb.append("市 : " + location.getCity() + "\n");
// sb.append("城市編碼 : " + location.getCityCode() + "\n");
// sb.append("區 : " + location.getDistrict() + "\n");
// sb.append("區域 碼 : " + location.getAdCode() + "\n");
// sb.append("地 址 : " + location.getAddress() + "\n");
// sb.append("興趣點 : " + location.getPoiName() + "\n");
// 定位完成的時間
// sb.append("定位時間: " + Utils.formatUTC(location.getTime(),
// "yyyy-MM-dd-HH:mm:ss") + "\n");
longitude = (float) location.getLongitude();
latitude = (float) location.getLatitude();
} else {
// 定位失敗
sb.append("定位失敗" + "\n");
sb.append("錯誤碼:" + location.getErrorCode() + "\n");
sb.append("錯誤信息:" + location.getErrorInfo() + "\n");
sb.append("錯誤描述:" + location.getLocationDetail() + "\n");
}
} else {
// "定位失敗"
}
}
};
// 開始定位
public static void startLocation() {
// 啓動定位
locationClient.startLocation();
}
// 銷燬定位
private void destroyLocation() {
if (null != locationClient) {
/**
* 如果AMapLocationClient是在當前Activity實例化的,
* 在Activity的onDestroy中一定要執行AMapLocationClient的onDestroy
*/
locationClient.stopLocation();
locationClient.onDestroy();
locationClient = null;
locationOption = null;
}
}
// 得到經度
public static float getLongitude() {
return longitude;
}
// 得到緯度
public static float getLatitude() {
return latitude;
}
@Override
protected void onResume() {
super.onResume();
SDKWrapper.getInstance().onResume();
}
@Override
protected void onPause() {
super.onPause();
SDKWrapper.getInstance().onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
SDKWrapper.getInstance().onDestroy();
destroyLocation();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
SDKWrapper.getInstance().onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
SDKWrapper.getInstance().onNewIntent(intent);
}
@Override
protected void onRestart() {
super.onRestart();
SDKWrapper.getInstance().onRestart();
}
@Override
protected void onStop() {
super.onStop();
SDKWrapper.getInstance().onStop();
}
@Override
public void onBackPressed() {
SDKWrapper.getInstance().onBackPressed();
super.onBackPressed();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
SDKWrapper.getInstance().onConfigurationChanged(newConfig);
super.onConfigurationChanged(newConfig);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
SDKWrapper.getInstance().onRestoreInstanceState(savedInstanceState);
super.onRestoreInstanceState(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
SDKWrapper.getInstance().onSaveInstanceState(outState);
super.onSaveInstanceState(outState);
}
@Override
protected void onStart() {
SDKWrapper.getInstance().onStart();
super.onStart();
}
}
接來下打開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>
<!--用於申請調用A-GPS模塊-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
接下來把申請到的key寫入application配置裏面
<!-- 定位sdk需要配置 -->
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="這裏寫入剛纔高德開放平臺申請的key"/>
<service android:name="com.amap.api.location.APSService"></service>
下一步把下載的高德sdk的jar文件導入到Android studio工程目錄下app文件夾下的libs文件夾下,如果沒有,則新建一個libs文件夾,如下圖
至此全部完成