/******************************************************************************/
获取用户当前位置,需要配合定位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();
}
/**
* 方法必须重写
* map的生命周期方法
*/
@Override
public void onPause() {
super.onPause();
mapView.onPause();
}
/**
* 方法必须重写
* map的生命周期方法
*/
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
/**
* 方法必须重写
* map的生命周期方法
*/
@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) {
}
}