1. 程式人生 > >android ------ 實現高德定位並獲取相應資訊 ( 最新版高德SDK 和 Android SDK版本)

android ------ 實現高德定位並獲取相應資訊 ( 最新版高德SDK 和 Android SDK版本)

Android開發專案時常常會遇到定位這個功能, 很久以前寫過一篇了,官方也更新了一些東西,我也更新下

以前使用的是jar包 匯入來實現高德定位

老版本 連結:https://blog.csdn.net/DickyQie/article/details/56840100

 

現在通過Gradle整合SDK(也可以使用jar包)

 //定位依賴
    implementation 'com.amap.api:location:latest.integration'

之後到高德申請key值,登入開啟控制檯 點選建立應用,如圖:

填寫相應資訊,

名稱,PackageName:專案的包名,至於SHA1安全碼可以這樣獲取,可以 Window+R 開啟控制檯  輸入cmd點選確定

之後在彈框中完成以下操作就可以看到SHA1安全碼了

上圖的金鑰庫口令預設的是:android        (注:輸入口令是看不見的,輸入完成Enter即可)

以上是測試版獲取SHA1,釋出版SHA1獲取請看部落格   Android Studio apk打包,keystore.jks檔案生成,根據keystore金鑰獲取SHA1安全碼

輸入完資訊確定就可以看到key值了

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>
    <!--用於申請獲取藍芽資訊進行室內定位-->
    <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>

<application>標籤中新增Key值資訊

<service android:name="com.amap.api.location.APSService"></service>
 <meta-data android:name="com.amap.api.v2.apikey" android:value="2ca77496c8ae6b92cef9e15dfd68b87b">
 </meta-data>

Activity程式碼:(和以前的相比少了很多不必要的程式碼)

 /***
     * 定位
     */
    private void showLocation() {
        try {
            mlocationClient = new AMapLocationClient(this);
            mLocationOption = new AMapLocationClientOption();
            mlocationClient.setLocationListener(this);
            //設定定位模式為高精度模式,Battery_Saving為低功耗模式,Device_Sensors是僅裝置模式
            mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
            mLocationOption.setInterval(5000);
            //設定定位引數
            mlocationClient.setLocationOption(mLocationOption);
            //啟動定位
            mlocationClient.startLocation();
        } catch (Exception e) {

        }
    }

    @Override
    public void onLocationChanged(AMapLocation amapLocation) {
        try {
            if (amapLocation != null) {
                if (amapLocation.getErrorCode() == 0) {
                    //定位成功回撥資訊,設定相關訊息

                    //獲取當前定位結果來源,如網路定位結果,詳見定位型別表
                    Log.i("定位型別", amapLocation.getLocationType() + "");
                    Log.i("獲取緯度", amapLocation.getLatitude() + "");
                    Log.i("獲取經度", amapLocation.getLongitude() + "");
                    Log.i("獲取精度資訊", amapLocation.getAccuracy() + "");

                    //如果option中設定isNeedAddress為false,則沒有此結果,網路定位結果中會有地址資訊,GPS定位不返回地址資訊。
                    Log.i("地址", amapLocation.getAddress());
                    Log.i("國家資訊", amapLocation.getCountry());
                    Log.i("省資訊", amapLocation.getProvince());
                    Log.i("城市資訊", amapLocation.getCity());
                    Log.i("城區資訊", amapLocation.getDistrict());
                    Log.i("街道資訊", amapLocation.getStreet());
                    Log.i("街道門牌號資訊", amapLocation.getStreetNum());
                    Log.i("城市編碼", amapLocation.getCityCode());
                    Log.i("地區編碼", amapLocation.getAdCode());
                    Log.i("獲取當前定位點的AOI資訊", amapLocation.getAoiName());
                    Log.i("獲取當前室內定位的建築物Id", amapLocation.getBuildingId());
                    Log.i("獲取當前室內定位的樓層", amapLocation.getFloor());
                    Log.i("獲取GPS的當前狀態", amapLocation.getGpsAccuracyStatus() + "");

                    //獲取定位時間
                    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    Date date = new Date(amapLocation.getTime());

                    Log.i("獲取定位時間", df.format(date));


                    // 停止定位
                    mlocationClient.stopLocation();
                } else {
                    //定位失敗時,可通過ErrCode(錯誤碼)資訊來確定失敗的原因,errInfo是錯誤資訊,詳見錯誤碼錶。
                    Log.e("AmapError", "location Error, ErrCode:"
                            + amapLocation.getErrorCode() + ", errInfo:"
                            + amapLocation.getErrorInfo());
                }
            }
        } catch (Exception e) {
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        // 停止定位
        if (null != mlocationClient) {
            mlocationClient.stopLocation();
        }
    }

    /**
     * 銷燬定位
     */
    private void destroyLocation() {
        if (null != mlocationClient) {
            /**
             * 如果AMapLocationClient是在當前Activity例項化的,
             * 在Activity的onDestroy中一定要執行AMapLocationClient的onDestroy
             */
            mlocationClient.onDestroy();
            mlocationClient = null;
        }
    }

    @Override
    protected void onDestroy() {
        destroyLocation();
        super.onDestroy();
    }

執行得到日誌:

 

 

程式碼地址Github :https://github.com/DickyQie/and