擷取使用者目前位置,需要配合定位SDK一起使用,本人在使用過程中,發現新舊版本的定位SDK差别很大,本人推薦使用舊版本的SDK,因為網上的許多教程都是使用舊版本的SDK進行講解的,網上下載下傳的源碼大多數也是基于舊版本的,而且高德官方的文檔更新的不是很及時,SDK是新版本的,但是文檔确實舊版本的,讓你開發很無語。
舊版本SDK: http://pan.baidu.com/s/1pKujpNX
package rfidlib.com.fangaiwujiwu.ui;
import android.app.Activity; import android.location.Location; import android.os.Bundle; import com.amap.api.location.AMapLocation; import com.amap.api.location.AMapLocationListener; import com.amap.api.location.LocationManagerProxy; import com.amap.api.location.LocationProviderProxy; import com.amap.api.maps.AMap; import com.amap.api.maps.CameraUpdateFactory; import com.amap.api.maps.LocationSource; import com.amap.api.maps.MapView; import com.amap.api.maps.model.BitmapDescriptorFactory; import com.amap.api.maps.model.MyLocationStyle; import rfidlib.com.fangaiwujiwu.R; public class SearchActivity extends Activity implements LocationSource,AMapLocationListener { private static final String TAG ="SearchActivity"; private MapView mapView; private AMap aMap; private LocationSource.OnLocationChangedListener mListener; private LocationManagerProxy mAMapLocationManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search); initView(savedInstanceState); } private void initView(Bundle savedInstanceState){ mapView = (MapView) findViewById(R.id.map); mapView.onCreate(savedInstanceState);// 必須要寫 if(aMap==null){ aMap = mapView.getMap(); } aMap.setLocationSource(this);// 設定定位監聽 aMap.getUiSettings().setMyLocationButtonEnabled(true);// 設定預設定位按鈕是否顯示 aMap.setMyLocationEnabled(true);// 設定為true表示顯示定位層并可觸發定位,false表示隐藏定位層并不可觸發定位,預設是false // 自定義系統定位藍點 MyLocationStyle myLocationStyle = new MyLocationStyle(); // 自定義定位藍點圖示 myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.drawable.location_marker)); // 将自定義的 myLocationStyle 對象添加到地圖上 aMap.setMyLocationStyle(myLocationStyle); // 構造 LocationManagerProxy 對象 mAMapLocationManager = LocationManagerProxy.getInstance(getApplicationContext()); } @Override public void onResume() { super.onResume(); mapView.onResume(); } @Override public void onPause() { super.onPause(); mapView.onPause(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mapView.onSaveInstanceState(outState); } @Override public void onDestroy() { super.onDestroy(); mapView.onDestroy(); } @Override public void activate(OnLocationChangedListener onLocationChangedListener) { mListener = onLocationChangedListener; if (mAMapLocationManager == null) { mAMapLocationManager = LocationManagerProxy.getInstance(getApplicationContext()); //此方法為每隔固定時間會發起一次定位請求,為了減少電量消耗或網絡流量消耗, //注意設定合适的定位時間的間隔,并且在合适時間調用removeUpdates()方法來取消定位請求 //在定位結束後,在合适的生命周期調用destroy()方法 //其中如果間隔時間為-1,則定位隻定一次 mAMapLocationManager.requestLocationData(LocationProviderProxy.AMapNetwork, -1, 10, this); } } @Override public void deactivate() { mListener = null; if (mAMapLocationManager != null) { mAMapLocationManager.removeUpdates(this); mAMapLocationManager.destroy(); } mAMapLocationManager = null; } @Override public void onLocationChanged(AMapLocation aMapLocation) { if (mListener != null &&aMapLocation != null) { if (aMapLocation.getAMapException().getErrorCode() == 0) { mListener.onLocationChanged(aMapLocation);// 顯示系統小藍點 //擷取位置資訊 Double dgeoLat = aMapLocation.getLatitude(); Double geoLng = aMapLocation.getLongitude(); aMap.moveCamera(CameraUpdateFactory.zoomTo(16)); } } } @Override public void onLocationChanged(Location location) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } }