本文參考文章:
http://www.apkbus.com/blog-904057-63610.html
本人實現的 定位代碼:(具體配置省略,可見參考文章)
package com.example.demo.fuction; import android.graphics.BitmapFactory; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.util.Log; 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.AMapOptions; import com.amap.api.maps2d.CameraUpdateFactory; import com.amap.api.maps2d.MapView; import com.amap.api.maps2d.UiSettings; import com.amap.api.maps2d.model.BitmapDescriptor; import com.amap.api.maps2d.model.BitmapDescriptorFactory; import com.amap.api.maps2d.model.LatLng; import com.amap.api.maps2d.model.Marker; import com.amap.api.maps2d.model.MarkerOptions; import com.joe.ditudemo.R; import static com.amap.api.location.AMapLocationClientOption.AMapLocationMode.Hight_Accuracy; /** * Created by Joe. */ public class GetMyLocationActivity extends AppCompatActivity { //聲明AMapLocationClient類對象 public AMapLocationClient mLocationClient = null; //聲明mLocationOption對象 public AMapLocationClientOption mLocationOption = null; private double lat; private double lon; private MapView mapView; private AMap aMap;//地圖控制器對象 private UiSettings mUiSettings; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_get_mylocation); //初始化定位 mLocationClient = new AMapLocationClient(getApplicationContext()); //設置定位回調監聽 mLocationClient.setLocationListener(mLocationListener);//設置其為定位完成后的回調函數 mapView = (MapView) findViewById(R.id.mapView); mapView.onCreate(savedInstanceState); init(); } /** * * 初始化AMap類對象 aMap 地圖控制器 */ private void init() { if (aMap == null) { aMap = mapView.getMap();//地圖控制器對象 mUiSettings = aMap.getUiSettings(); } //設置logo位置 mUiSettings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_CENTER);//高德地圖標志的擺放位置 mUiSettings.setZoomControlsEnabled(true);//地圖縮放控件是否可見 mUiSettings.setZoomPosition(AMapOptions.ZOOM_POSITION_RIGHT_BUTTOM);//地圖縮放控件的擺放位置 //aMap 為地圖控制器對象 aMap.getUiSettings().setMyLocationButtonEnabled(true);//地圖的定位標志是否可見 aMap.setMyLocationEnabled(true);//地圖定位標志是否可以點擊 setUpMap(); } /** * 配置定位參數 */ private void setUpMap() { //初始化定位參數 mLocationOption = new AMapLocationClientOption(); //設置定位模式為高精度模式,Battery_Saving為低功耗模式,Device_Sensors是僅設備模式 mLocationOption.setLocationMode(Hight_Accuracy); //設置是否返回地址信息(默認返回地址信息) mLocationOption.setNeedAddress(true); //設置是否只定位一次,默認為false mLocationOption.setOnceLocation(false); //設置是否允許模擬位置,默認為false,不允許模擬位置 mLocationOption.setMockEnable(false); //設置定位間隔,單位毫秒,默認為2000ms mLocationOption.setInterval(2000); //給定位客戶端對象設置定位參數 mLocationClient.setLocationOption(mLocationOption); //啟動定位 mLocationClient.startLocation(); } public AMapLocationListener mLocationListener = new AMapLocationListener() { @Override public void onLocationChanged(AMapLocation amapLocation) { if (amapLocation != null) { if (amapLocation.getErrorCode() == 0) { Log.v("getLocationType", ""+amapLocation.getLocationType() ) ; lat = amapLocation.getLatitude(); lon = amapLocation.getLongitude(); Log.v("getAccuracy", ""+amapLocation.getAccuracy()+" 米");//獲取精度信息 Log.v("joe", "lat :-- " + lat + " lon :--" + lon); Log.v("joe", "Country : " + amapLocation.getCountry() + " province : " + amapLocation.getProvince() + " City : " + amapLocation.getCity() + " District : " + amapLocation.getDistrict()); //清空緩存位置 aMap.clear(); // 設置顯示的焦點,即當前地圖顯示為當前位置 aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lon), 18)); //aMap.moveCamera(CameraUpdateFactory.zoomTo(18)); //aMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(lat, lon))); MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(new LatLng(lat, lon)); markerOptions.title("我的位置"); markerOptions.visible(true); BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.icon_location)); markerOptions.icon(bitmapDescriptor); markerOptions.draggable(true); Marker marker = aMap.addMarker(markerOptions); marker.showInfoWindow(); } else { //顯示錯誤信息ErrCode是錯誤碼,errInfo是錯誤信息,詳見錯誤碼表。 Log.e("joe", "location Error, ErrCode:" + amapLocation.getErrorCode() + ", errInfo:" + amapLocation.getErrorInfo()); } } } }; /** * 重新繪制加載地圖 */ @Override protected void onResume() { super.onResume(); mapView.onResume(); } /** * 暫停地圖的繪制 */ @Override protected void onPause() { super.onPause(); mapView.onPause(); } /** * 保存地圖當前的狀態方法必須重寫 */ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mapView.onSaveInstanceState(outState); } /** * 銷毀地圖 */ @Override protected void onDestroy() { super.onDestroy(); mapView.onDestroy(); if (mLocationClient != null) { mLocationClient.stopLocation(); mLocationClient.onDestroy(); } mLocationClient = null; } }
以上代碼親測可行,不過有些不必要的設置沒有加,下面給出一些沒有加入的代碼:
// 設置定位請求超時時間,默認為30秒 // 單位是毫秒,默認30000毫秒,建議超時時間不要低於8000毫秒。 mLocationOption.setHttpTimeOut(50000); // 設置是否開啟定位緩存機制 // 緩存機制默認開啟,可以通過以下接口進行關閉。 // 當開啟定位緩存功能,在高精度模式和低功耗模式下進行的網絡定位結果均會生成本地緩存,不區分單次定位還是連續定位。GPS定位結果不會被緩存。 // 關閉緩存機制 mLocationOption.setLocationCacheEnable(false); // 設置是否只定位一次,默認為false mLocationOption.setOnceLocation(false); // 給定位客戶端對象設置定位參數 mLocationClient.setLocationOption(mLocationOption);
上面的 setHttpTimeOut 方法 是設置定位請求協議中的 http 超時的情況下的超時時間, 這里個人認為這是采用Wifi定位設置時采用的交互協議。
mLocationOption.setOnceLocation(false); 該方法是設置 定位 是否是只定位一次 ,也或者是會連續定位。
mLocationOption.setLocationCacheEnable(false); 定位的緩存結果設置選項
本人所寫的代碼某次運行后 打印的定位類型信息如下:


個人估計, 如果設置緩存后, APP 會把定位信息寫到緩存中, APP再次運行后如果在某個設定的時間內緩存中有定位信息則會先讀取緩存中的定位信息。
由於 本人做試驗的時候是在室內, gps定位效果不佳於是默認轉為了 wifi定位, 這時候提示的定位信息為 5 。
然后由於后面的定位都是連續的比較緊,在2000ms左右就又一次請求定位, 而且並沒有水平移動(手機的位移傳感器可以度量),於是直接采用前次的定位信息,這時的定位類型為 2 。