前期预备:运行权限(Android 6.0+)
/** 地图所需权限 :
* roup:android.permission-group.LOCATION(定位)
* android.permission.ACCESS_FINE_LOCATION(通过gps获取定位权限)
* android.permission.ACCESS_COARSE_LOCATION(通过wifi和移动基站获取定位权限)
**/
if (ContextCompat.checkSelfPermission(this,
// 未开启定位权限
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},LOCATION_REQUEST_CODE);
}else {
startLocation();
Toast.makeText(this, "已开启定位权限", Toast.LENGTH_SHORT).show();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
//刚才的识别码
case LOCATION_REQUEST_CODE:
//用户同意权限,执行我们的操作
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//开始定位
startLocation();
} else {
//用户拒绝之后,当然我们也可以弹出一个窗口,直接跳转到系统设置页面
Toast.makeText(this, "未开启定位权限,请手动到设置去开启权限", Toast.LENGTH_LONG).show();
}
break;
default:
break;
}
}
定位蓝点:
1.显示地图
@Override
public void initView() {
// 保存地图绘制的当前状态
mapDemoMapView.onCreate(new Bundle());
// 初始化地图控制器对象
if (aMap == null){
aMap = mapDemoMapView.getMap();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mapDemoMapView != null){
mapDemoMapView.onDestroy();
}
}
2. 定位
/**声明定位回调监听器 */
public AMapLocationListener mLocationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (amapLocation !=null ) {
if (amapLocation.getErrorCode() == 0) {
//定位成功回调信息,设置相关消息
//获取纬度
double latitude = amapLocation.getLatitude();
//获取经度
double longitude = amapLocation.getLongitude();
//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
LogUtil.i(TAG,"地址-----------------"+amapLocation.getAddress());
// 设置蓝点
setBlueDot(latitude,longitude);
} else {
//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
LogUtil.e("AmapError", "location Error, ErrCode:"
+ amapLocation.getErrorCode() + ", errInfo:"
+ amapLocation.getErrorInfo());
}
}
}
};
public void startLocation(){
mLocationClient = new AMapLocationClient(getApplicationContext());
mLocationOption = new AMapLocationClientOption();
//设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);
//获取一次定位结果:
//该方法默认为false。
mLocationOption.setOnceLocation(true);
//设置是否允许模拟位置,默认为false,不允许模拟位置
mLocationOption.setMockEnable(false);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
// 添加监听器
mLocationClient.setLocationListener(locationListener);
//启动定位
mLocationClient.startLocation();
}
3. 蓝点
private void setBlueDot(double latitude, double longitude) {
//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
myLocationStyle = new MyLocationStyle();
//设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。
myLocationStyle.interval(2000);
//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)默认执行此种模式。
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);
//设置是否显示定位小蓝点,用于满足只想使用定位,不想使用定位小蓝点的场景,设置false以后图面上不再有定位蓝点的概念,但是会持续回调位置信息。
myLocationStyle.showMyLocation(true);
//设置定位蓝点的icon图标方法,需要用到BitmapDescriptor类对象作为参数。
myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.drawable.ic_map_dot_blue));
//设置定位蓝点的Style
aMap.setMyLocationStyle(myLocationStyle);
// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。
aMap.setMyLocationEnabled(true);
// 地图中心移动到当前位置
aMap.moveCamera(CameraUpdateFactory.changeLatLng(
new LatLng(latitude, longitude)));
}
显示结果:
参考文档:https://lbs.amap.com/api/android-sdk/guide/create-map/mylocation