1. 程式人生 > >一頁程式碼實現高德地圖顯示自己定位,以及Marker標記點顯示(文末有福利哦)

一頁程式碼實現高德地圖顯示自己定位,以及Marker標記點顯示(文末有福利哦)

import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps2d.AMap;
import com.amap.api.maps2d.CameraUpdateFactory;
import com.amap.api.maps2d.LocationSource;
import com.amap.api.maps2d.MapView;
import com.amap.api.maps2d.UiSettings;
import com.amap.api.maps2d.model.MyLocationStyle;

import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity implements View.OnClickListener,LocationSource,AMapLocationListener {

    //宣告AMapLocationClient類物件
    public AMapLocationClient mLocationClient = null;
    //宣告AMapLocationClientOption物件
    public AMapLocationClientOption mLocationOption = null;

    private final int WRITE_COARSE_LOCATION_REQUEST_CODE = 10;
    private MapView mMapView;
    private OnLocationChangedListener mListener;

    //定位藍點
    MyLocationStyle myLocationStyle;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        mMapView = (MapView) findViewById(R.id.map_view);
        //在activity執行onCreate時執行mMapView.onCreate(savedInstanceState),實現地圖生命週期管理
        mMapView.onCreate(savedInstanceState);

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            //申請WRITE_EXTERNAL_STORAGE許可權
            ActivityCompat.requestPermissions(this, new String[]{
                            Manifest.permission.ACCESS_COARSE_LOCATION,
                            Manifest.permission.ACCESS_FINE_LOCATION,
                            Manifest.permission.WRITE_EXTERNAL_STORAGE,
                            Manifest.permission.READ_EXTERNAL_STORAGE,
                            Manifest.permission.READ_PHONE_STATE},
                    WRITE_COARSE_LOCATION_REQUEST_CODE);//自定義的code
        }

        AMap aMap = mMapView.getMap();
        if (aMap!= null){
            //設定顯示定位按鈕 並且可以點選
            UiSettings settings = aMap.getUiSettings();
            aMap.setLocationSource(this);//設定了定位的監聽,這裡要實現LocationSource介面
            // 是否顯示定位按鈕
            settings.setMyLocationButtonEnabled(true);

            //設定地圖的放縮級別
            aMap.moveCamera(CameraUpdateFactory.zoomTo(12));
            // 設定定位監聽
            aMap.setLocationSource(this);
            // 設定為true表示顯示定位層並可觸發定位,false表示隱藏定位層並不可觸發定位,預設是false
            aMap.setMyLocationEnabled(true);//顯示定位層並且可以觸發定位,預設是flase
        }

        //藍點初始化
        myLocationStyle = new MyLocationStyle();//初始化定位藍點樣式類myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//連續定位、且將視角移動到地圖中心點,定位點依照裝置方向旋轉,並且會跟隨裝置移動。(1秒1次定位)如果不設定myLocationType,預設也會執行此種模式。
        myLocationStyle.interval(2000); //設定連續定位模式下的定位間隔,只在連續定位模式下生效,單次定位模式下不會生效。單位為毫秒。
        aMap.setMyLocationStyle(myLocationStyle);//設定定位藍點的Style
        //aMap.getUiSettings().setMyLocationButtonEnabled(true);設定預設定位按鈕是否顯示,非必需設定。
        aMap.setMyLocationEnabled(true);// 設定為true表示啟動顯示定位藍點,false表示隱藏定位藍點並不進行定位,預設是false。
        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//連續定位、且將視角移動到地圖中心點,定位點依照裝置方向旋轉,並且會跟隨裝置移動。(1秒1次定位)預設執行此種模式。
        myLocationStyle.showMyLocation(true);

        aMap.setOnMyLocationChangeListener(new AMap.OnMyLocationChangeListener() {
            @Override
            public void onMyLocationChange(Location location) {
                //從location物件中獲取經緯度資訊,地址描述資訊,建議拿到位置之後呼叫逆地理編碼介面獲取
            }
        });

        //init();
    }

 

   

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理
        mMapView.onDestroy();
        mLocationClient.onDestroy();
    }
    @Override
    protected void onResume() {
        super.onResume();
        //在activity執行onResume時執行mMapView.onResume (),實現地圖生命週期管理
        mMapView.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
        //在activity執行onPause時執行mMapView.onPause (),實現地圖生命週期管理
        mMapView.onPause();
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //在activity執行onSaveInstanceState時執行mMapView.onSaveInstanceState (outState),實現地圖生命週期管理
        mMapView.onSaveInstanceState(outState);
    }

    @Override
    public void onClick(View v) {

    }

    @Override
    public void activate(OnLocationChangedListener onLocationChangedListener) {
        mListener = onLocationChangedListener;
        //初始化定位
        init();
    }

    @Override
    public void deactivate() {
        mListener = null;
    }

    @Override
    public void onLocationChanged(AMapLocation amapLocation) {
        //解析AMapLocation物件
        //首先,可以判斷AMapLocation物件不為空,當定位錯誤碼型別為0時定位成功。
        if (amapLocation != null) {
            if (amapLocation.getErrorCode() == 0) {
                mListener.onLocationChanged(amapLocation);// 顯示系統小藍點

                //可在其中解析amapLocation獲取相應內容。

                amapLocation.getLocationType();//獲取當前定位結果來源,如網路定位結果,詳見定位型別表
                amapLocation.getLatitude();//獲取緯度
                amapLocation.getLongitude();//獲取經度
                amapLocation.getAccuracy();//獲取精度資訊
                String address = amapLocation.getAddress();//地址,如果option中設定isNeedAddress為false,則沒有此結果,網路定位結果中會有地址資訊,GPS定位不返回地址資訊。
                String country = 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的當前狀態
                amapLocation.getGpsAccuracyStatus();
                //獲取定位時間
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date = new Date(amapLocation.getTime());
                String format = df.format(date);

                Log.e("qqqq", "地址:" + address + "----國家資訊:" + country + "----time--> " + format);

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

    private void init() {

        //初始化定位
        mLocationClient = new AMapLocationClient(getApplicationContext());

        //設定定位回撥監聽
        mLocationClient.setLocationListener(this);

        //初始化AMapLocationClientOption物件
        mLocationOption = new AMapLocationClientOption();


        //--------------------------------------------------
        //選擇定位場景

        /**
         * 設定定位場景,目前支援三種場景(簽到、出行、運動,預設無場景)
         */
        //mLocationOption.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn);

       /* if(null != mLocationClient){
            mLocationClient.setLocationOption(mLocationOption);
            //設定場景模式後最好呼叫一次stop,再呼叫start以保證場景模式生效
            mLocationClient.stopLocation();
            mLocationClient.startLocation();
        }*/

        //--------------------------------------------------
        //選擇定位模式

        //設定定位模式為AMapLocationMode.Hight_Accuracy,高精度模式。
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);

        //設定定位模式為AMapLocationMode.Battery_Saving,低功耗模式。
        //mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);

        //設定定位模式為AMapLocationMode.Device_Sensors,僅裝置模式。
        //mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Device_Sensors);

        //--------------------------------------------------
        //設定單次定位

        //獲取一次定位結果:
        //該方法預設為false。
        mLocationOption.setOnceLocation(true);

        //獲取最近3s內精度最高的一次定位結果:
        //設定setOnceLocationLatest(boolean b)介面為true,啟動定位時SDK會返回最近3s內精度最高的一次定位結果。如果設定其為true,setOnceLocation(boolean b)介面也會被設定為true,反之不會,預設為false。
        mLocationOption.setOnceLocationLatest(true);

        //--------------------------------------------------
        //自定義連續定位

        //SDK預設採用連續定位模式,時間間隔2000ms。如果您需要自定義呼叫間隔:
        //設定定位間隔,單位毫秒,預設為2000ms,最低1000ms。
        mLocationOption.setInterval(1000);

        //--------------------------------------------------
        //其他引數
        //設定是否返回地址資訊(預設返回地址資訊)
        mLocationOption.setNeedAddress(true);

        //設定是否允許模擬軟體Mock位置結果,多為模擬GPS定位結果,預設為true,允許模擬位置。
        //設定是否允許模擬位置,預設為true,允許模擬位置
        mLocationOption.setMockEnable(true);

        //設定定位請求超時時間,預設為30秒。
        //單位是毫秒,預設30000毫秒,建議超時時間不要低於8000毫秒。
        mLocationOption.setHttpTimeOut(20000);

        //設定是否開啟定位快取機制
        //快取機制預設開啟,可以通過以下介面進行關閉。
        //當開啟定位快取功能,在高精度模式和低功耗模式下進行的網路定位結果均會生成本地快取,不區分單次定位還是連續定位。GPS定位結果不會被快取。
        //關閉快取機制
        mLocationOption.setLocationCacheEnable(true);

        //--------------------------------------------------
        //啟動定位
        //給定位客戶端物件設定定位引數
        mLocationClient.setLocationOption(mLocationOption);
        //啟動定位
        mLocationClient.startLocation();

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

        //銷燬定位客戶端
        //銷燬定位客戶端之後,若要重新開啟定位請重新New一個AMapLocationClient物件。
        //mLocationClient.onDestroy();//銷燬定位客戶端,同時銷燬本地定位服務。

        //注意事項
        //目前手機裝置在長時間黑屏或鎖屏時CPU會休眠,這導致定位SDK不能正常進行位置更新。
        //若您有鎖屏狀態下獲取位置的需求,您可以應用alarmManager實現1個可叫醒CPU的Timer,定時請求定位。
        //使用定位SDK務必要註冊GPS和網路的使用許可權。
        //在使用定位SDK時,請儘量保證網路暢通,如獲取網路定位,地址資訊等都需要裝置可以正常接入網路。
        // 定位SDK在國內返回高德型別座標,海外定位將返回GPS座標。
    }
}

如果要在地圖示記顯示後臺返回的很多點,如後臺返回了一堆list集合,裡面包含了很多個經緯度以及其他資料,則呼叫此方法即可:

 /***
     *  將網點資料展示在地圖上
     */
    private void showSiteOnAmap() {
        Double lat = null;
        Double lng = null;
        LatLng latLng = null;
//        Marker marker = aMap.addMarker(new MarkerOptions().position(latLng).title("標題").snippet("詳情"));
        for (int i = 0; i < arrayList.size(); i++) {
            lat = Double.parseDouble(arrayList.get(i).get("lat")+"");
            lng = Double.parseDouble(arrayList.get(i).get("lng")+"");
            latLng = new LatLng(lat, lng);
            Marker marker = aMap.addMarker(new MarkerOptions().position(latLng).title(arrayList.get(i).get("brandName")+""));
        }
    }

如果只標記顯示一個點,則兩行程式碼即可:

latLng = new LatLng(lat, lng);
aMap.addMarker(new MarkerOptions().position(latLng).title(arrayList.get(i).get("brandName")+""));

我發了888元10個紅包,支付寶掃碼領取哦!