1. 程式人生 > >關於Android整合高德地圖的那些事兒...顯示地圖

關於Android整合高德地圖的那些事兒...顯示地圖

    記得在2016年的時候, 有個專案需要在地圖上新增Marker 並且連點成線記錄座標 和 地理圍欄,  當時也是第一次做,確實有點懵, 不過時間久了, 也還挺簡單的 ; 最近專案中又用到了地圖 , 藉此機會 , 重構下之前的邏輯 , 之前用的是高德地圖 , 個人感覺還不錯 ,比某度好多了, 開始coding前不妨先下載官方的Demo 看下效果 , 參考下整合文件...

   好了, 今天我們一起來完成高德3D地圖程式碼的整合 , 申請AppKey什麼的 , 請自己去高德地圖開放平臺的控制檯註冊

   現在高德地圖整合已經支援了AndroidStudio依賴 , 不要太簡單了 , 這裡我整合的是3D map、定位、搜尋 

dependencies { 
    implementation 'com.amap.api:3dmap:latest.integration'
    implementation 'com.amap.api:search:latest.integration'
    implementation 'com.amap.api:location:latest.integration'
}

   宣告許可權來一波

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 允許程式訪問WiFi網路資訊 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 允許程式讀寫手機狀態和身份 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 允許程式訪問CellID或WiFi熱點來獲取粗略的位置 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 定位包、導航包需要的額外許可權(注:基礎許可權也需要) -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

清單檔案註冊高德地圖 APPKey在高德地圖的控制檯註冊

<!--定位服務-->
 <service android:name="com.amap.api.location.APSService" />
 <meta-data
         android:name="com.amap.api.v2.apikey"
         android:value="APPkey" />

  開始擼程式碼 , 先來個介面初始化;

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map_layout);
        mapView = findViewById(R.id.mapView);
        mapView.onCreate(savedInstanceState);
        aMap = mapView.getMap();
        aMap.getUiSettings().setScaleControlsEnabled(true);// 標尺開關
        aMap.getUiSettings().setZoomControlsEnabled(false);//縮放按鈕
        aMap.moveCamera(CameraUpdateFactory.zoomTo(ZOOM_MAP));
        aMap.setMyLocationEnabled(true);//觸發定位
        aMap.setLocationSource(this);//設定定位資源監聽(包含啟用定位和銷燬定位)
        initLocationOption();//初始化定位客戶端 
    }

  初始化定位引數: 定位方式分為三種: Hight_Accuracy(高精度)、Battery_Saving(低功耗)、Device_Sensors(僅裝置)

private void initLocationOption() {
        AMapLocationClientOption.AMapLocationMode mode;
        if (Utils.isGpsOpen(this)) {
            mode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy;//高精度模式。
            Log.e(TAG, "當前定位模式為 --->>> 高精度模式");
        } else if (Utils.isGpsNetWorkOpen(this)) {
            mode = AMapLocationClientOption.AMapLocationMode.Battery_Saving;//低功耗模式。
            Log.e(TAG, "當前定位模式為 --->>> 低功耗模式");
        } else {
            mode = AMapLocationClientOption.AMapLocationMode.Device_Sensors;//僅限裝置模式。
            Log.e(TAG, "當前定位模式為 --->>> 僅限裝置模式");
        }
        if (mLocationOption == null) {
            mLocationOption = new AMapLocationClientOption()
                    .setLocationMode(mode)
                    .setNeedAddress(true)//設定是否返回地址資訊(預設返回地址資訊)
                    .setInterval(2000)//設定定位間隔,單位毫秒,預設為2000ms,最低1000ms。
                    .setHttpTimeOut(8000)//單位是毫秒,預設30000毫秒,建議超時時間不要低於8000毫秒。
                    .setLocationCacheEnable(true);//快取機制預設開啟,可以通過以下介面進行關閉。
        } else {
            mLocationOption.setLocationMode(mode);
        }
        if (mLocationClient == null) {
            mLocationClient = new AMapLocationClient(getApplicationContext());//初始化定位
            mLocationClient.setLocationListener(this);//設定定位回撥監聽
            mLocationClient.setLocationOption(mLocationOption);
        } else {
            mLocationClient.setLocationOption(mLocationOption);
        }
        mLocationClient.startLocation();//啟動定位
    }

  啟用定位

@Override
    public void activate(OnLocationChangedListener onLocationChangedListener) {
        initLocationOption();
        mLocationListener = onLocationChangedListener;
    }

  銷燬定位 和 實現地圖的生命週期管理

    @Override
    public void deactivate() {
        releaseClient();
    }
    @Override
    protected void onResume() {
        super.onResume();
        if (mapView != null) mapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mapView != null) mapView.onPause();
        if (mLocationClient != null) mLocationClient.stopLocation();//停止定位後,本地定位    服務並不會被銷燬
    }

    private void releaseClient() {
        if (mLocationClient != null) {
            mLocationClient.stopLocation();//停止定位後,本地定位服務並不會被銷燬
            mLocationClient.onDestroy();//銷燬定位客戶端,同時銷燬本地定位服務。
            mLocationClient = null;
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        if (mapView != null) mapView.onSaveInstanceState(outState);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mapView != null) mapView.onDestroy();
        releaseClient();  
    }

 定位回撥,可在onLocationChanged() 拿到當前定位的座標資訊

     @Override
    public void onLocationChanged(AMapLocation aMapLocation) {
        if (aMapLocation != null) {
            LatLng latLng;
            if (aMapLocation.getErrorCode() == 0) {
                this.aMapLocation = aMapLocation;
                if (mLocationClient != null) {
                    mLocationClient.stopLocation();
                }
                mLocationListener.onLocationChanged(aMapLocation);//顯示系統定位小藍點
                latLng = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude());
            } else {
                latLng = centerLatLng;//定位失敗時 預設的地圖中心點
                Toast(aMapLocation.getErrorInfo());
                //定位失敗時,可通過ErrCode(錯誤碼)資訊來確定失敗的原因,errInfo是錯誤資訊,詳見錯誤碼錶。
                Log.e("AmapError", "location Error, ErrCode:"
                        + aMapLocation.getErrorCode() + ", errInfo:"
                        + aMapLocation.getErrorInfo());
            }
            aMap.moveCamera(CameraUpdateFactory.changeLatLng(latLng));//定位回撥後,將地圖移動至定位點
        }
    }

 最後送上預覽圖片

預覽圖片