CocosCreator系列教程——接入高德地圖sdk獲取經緯度信息圖文詳解

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文件夾,如下圖
在這裏插入圖片描述
至此全部完成

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