1. 程式人生 > >高德地圖 ——獲取定位資訊

高德地圖 ——獲取定位資訊

上一篇文章已經講解了如何整合高德地圖SDK:跳轉連結

如何你想獲取附近位置資訊 關鍵字檢索poi:跳轉這兒

下面我們介紹下定位功能:

配置AndroidManifest檔案

上一篇文章已經講解清單檔案配置:  對應的許可權,服務和key值  

注意:定位需要服務

   <!-- 定位需要的服務 -->
   <service android:name="com.amap.api.location.APSService"/>

初始化定位

先看下我們可以拿到的定位資訊:

開啟許可權 :

  //設定定位許可權
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_PERMISSION_LOCATION);
        } else {
            // 初始化定位並設定定位回撥監聽
            getCurrentLocationLatLng();
        }

初始化定位:

   //初始化定位
    mLocationClient = new AMapLocationClient(getApplicationContext());
    //設定定位回撥監聽
    mLocationClient.setLocationListener(mLocationListener);
    //初始化AMapLocationClientOption物件
    mLocationOption = new AMapLocationClientOption();
   // 同時使用網路定位和GPS定位,優先返回最高精度的定位結果,以及對應的地址描述資訊
        
 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
  // 設定為單次定位  : 預設為false
  mLocationOption.setOnceLocation(true);
 //設定定位請求超時時間 : 單位是毫秒,預設30000毫秒,建議超時時間不要低於8000毫秒。
  mLocationOption.setHttpTimeOut(20000);
  //啟動地位:
  //給定位客戶端物件設定定位引數
   mLocationClient.setLocationOption(mLocationOption);
   //啟動定位
  mLocationClient.startLocation();

定位回撥監聽:

AMapLocationListener介面只有onLocationChanged方法可以實現,用於接收非同步返回的定位結果,回撥引數是AMapLocation。

首先,可以判斷AMapLocation物件不為空,當定位錯誤碼型別為0時定位成功。

  public AMapLocationListener mLocationListener = new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation amapLocation) {
            if (!isGpsEnabled(getApplicationContext())) {
                Toast toast = Toast.makeText(getApplicationContext(), "未開啟GPS", Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
            } else {
                if (amapLocation != null) {
                    if (amapLocation.getErrorCode() == 0) {
                        //定位成功回撥資訊,設定相關訊息
                       //獲取定位資訊

                    } else {
                        //顯示錯誤資訊ErrCode是錯誤碼,errInfo是錯誤資訊,詳見錯誤碼錶。
                        Log.e("AmapError", "location Error, ErrCode:"
                                + amapLocation.getErrorCode() + ", errInfo:"
                                + amapLocation.getErrorInfo());
                    }
                }
            }
        }
    };

當定位成功時,可在如上判斷中解析amapLocation物件的具體欄位,參考如下:

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

最後一定記得停止定位:

停止定位

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

銷燬定位客戶端

銷燬定位客戶端之後,若要重新開啟定位請重新New一個AMapLocationClient物件。

mLocationClient.onDestroy();//銷燬定位客戶端,同時銷燬本地定位服務。

下面附上完整程式碼如下:


import android.Manifest;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Gravity;
import android.widget.TextView;
import android.widget.Toast;

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.services.core.LatLonPoint;

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

public class ActionActivity extends AppCompatActivity {
    //許可權設定
    private static final int REQUEST_PERMISSION_LOCATION = 0;
    //宣告AMapLocationClient類物件
    AMapLocationClient mLocationClient = null;
    //宣告AMapLocationClientOption物件
    public AMapLocationClientOption mLocationOption = null;

    private TextView tv_action;

    @TargetApi(Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_location);
        tv_action = (TextView) findViewById(R.id.tv_action);
        //設定定位許可權
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_PERMISSION_LOCATION);
        } else {
            // 初始化定位並設定定位回撥監聽
            getCurrentLocationLatLng();
        }


    }

    /**
     * 初始化定位並設定定位回撥監聽
     */
    private void getCurrentLocationLatLng() {
        //初始化定位
        mLocationClient = new AMapLocationClient(getApplicationContext());
        //設定定位回撥監聽
        mLocationClient.setLocationListener(mLocationListener);
        //初始化AMapLocationClientOption物件
        mLocationOption = new AMapLocationClientOption();

     /* //設定定位場景,目前支援三種場景(簽到、出行、運動,預設無場景) 設定了場景就不用配置定位模式等
        option.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn);
        if(null != locationClient){
            locationClient.setLocationOption(option);
            //設定場景模式後最好呼叫一次stop,再呼叫start以保證場景模式生效
            locationClient.stopLocation();
            locationClient.startLocation();
        }*/

        //選擇定位模式:高德定位服務包含GPS和網路定位(Wi-Fi和基站定位)兩種能力。
        // 定位SDK將GPS、網路定位能力進行了封裝,以三種定位模式對外開放,SDK預設選擇使用高精度定位模式。
       /* //只會使用網路定位
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
        //只使用GPS進行定位
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Device_Sensors);*/
        // 同時使用網路定位和GPS定位,優先返回最高精度的定位結果,以及對應的地址描述資訊
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);

        // 設定為單次定位  : 預設為false
        mLocationOption.setOnceLocation(true);
        //設定定位間隔,單位毫秒,預設為2000ms,最低1000ms。;
        //mLocationOption.setInterval(3500);


        //設定是否返回地址資訊(預設返回地址資訊)
    /*mLocationOption.setNeedAddress(true);*/

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


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

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

    /**
     * 定位回撥監聽器
     */
    public AMapLocationListener mLocationListener = new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation amapLocation) {
            if (!isGpsEnabled(getApplicationContext())) {
                Toast toast = Toast.makeText(getApplicationContext(), "未開啟GPS", Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
            } else {
                if (amapLocation != null) {
                    if (amapLocation.getErrorCode() == 0) {
                        //定位成功回撥資訊,設定相關訊息
                        amapLocation.getLocationType();//獲取當前定位結果來源,如網路定位結果,詳見定位型別表
                        double currentLat = amapLocation.getLatitude();//獲取緯度
                        double currentLon = amapLocation.getLongitude();//獲取經度
                        LatLonPoint latLonPoint = new LatLonPoint(currentLat, currentLon);  // latlng形式的
                        amapLocation.getAccuracy();//獲取精度資訊

                        //獲取定位時間
                        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        Date date = new Date(amapLocation.getTime());
                        df.format(date);
                        amapLocation.getAddress();//地址,如果option中設定isNeedAddress為false,則沒有此結果,網路定位結果中會有地址資訊,GPS定位不返回地址資訊。
                        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.getGpsAccuracyStatus();//獲取GPS的當前狀態

                        tv_action.setText("定位時間:" + df.format(date) + "\n"
                                + "地址:" + amapLocation.getAddress() + "\n"
                                + "國家資訊:" + amapLocation.getCountry() + "\n"
                                + "省資訊:" + amapLocation.getProvince() + "\n"
                                + "城市資訊:" + amapLocation.getCity() + "\n"
                                + "城區資訊:" + amapLocation.getDistrict() + "\n"
                                + "街道資訊:" + amapLocation.getStreet() + "\n"
                                + "街道門牌號資訊:" + amapLocation.getStreetNum() + "\n"
                                + "城市編碼:" + amapLocation.getCityCode() + "\n"
                                + "地區編碼:" + amapLocation.getAdCode() + "\n"
                                + "獲取當前定位點的AOI資訊:" + amapLocation.getAoiName()
                        );


                    } else {
                        //顯示錯誤資訊ErrCode是錯誤碼,errInfo是錯誤資訊,詳見錯誤碼錶。
                        Log.e("AmapError", "location Error, ErrCode:"
                                + amapLocation.getErrorCode() + ", errInfo:"
                                + amapLocation.getErrorInfo());
                    }
                }
            }
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mLocationClient != null) {
            //銷燬定位客戶端,同時銷燬本地定位服務。
            mLocationClient.onDestroy();
        }
    }

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


    //判斷GPS是否開啟
    private boolean isGpsEnabled(Context context) {
        LocationManager locationManager = (LocationManager) context
                .getSystemService(Context.LOCATION_SERVICE);
        // 判斷GPS模組是否開啟
        return locationManager != null && locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    }
}

詳細定位sdk介紹請看 高德開發指南:https://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation/

demo下載連結:https://download.csdn.net/download/shanshan_1117/10679670

demo效果圖: