我们成功获取到动态定位的权限之后,需要进一步获取到手机当前的定位信息,并在地图上能够显示出来。而鸿蒙APP的界面中要显示高德地图的当前定位,可以通过“小蓝点”这个图标来进行标记,让手机用户很明显地知道自己在哪里。
如上图,我们在高德地图中看到了一个“小蓝点”图标。引入高德地图SDK后,我们的鸿蒙APP要实现手机当前定位的“小蓝点”,需要以下4个步骤:
(1).打开华为手机中的【位置信息】开关,激活定位器Locator;
(2).开启Locator的定位,通过RequestParam选择手机的精确定位类型,获取LocatorCallback接口中实时发送的定位坐标值;
(3).通过高德地图SDK提供的Amap对象,在自己的slice类中创建全局变量,获取LocatorCallback接口类的onLocationReport()方法中输出的定位值location;
(4).获取到定位坐标数据后,通过LocationSource接口提供的监听器OnLocationChangedListener去触发“小蓝点”在高德地图上显示,我们还可以继续使用高德地图提供的MyLocationStyle对象来改变定位图标的样式风格,最后仍需要绑定到Amap对象中。
为了能够实现此功能,我们还是一起来敲下代码去实现它。
在激活Locator这个对象之前,我们一定获取到相应的位置权限,比如ohos.permission.LOCATION 和 ohos.permission.LOCATION_IN_BACKGROUND。
没有这两个权限,我们的手机定位数据会显示null, Locator这个对象也无法激活。如果你还没有实现“获取位置权限”的过程,可以搜索我上一篇的内容:鸿蒙开发版高德地图SDK-手机定位(一):获取手机的「位置」权限。
当位置权限能够进行动态的选择之后,我们要激活定位器Locator代码如下:
// 定位器
private Locator locator;
/**
* 激活"位置信息"的locator开关
*/
public void isOpenLocationSwitch(){
HiLog.info(hilog,"获取定位器" );
locator = new Locator(getContext());
//判断“位置信息”开关是否已开启
if(locator.isLocationSwitchOn()){
HiLog.info(hilog,"[位置信息]开关已开启" );
//onLocationChangeListener();
} else {
//结束定位
locator.stopLocating(mylocatorCallBack);
}
}
我们需要选择设备的定位类型,可以使用RequestParam来选择更精确的定位方式,并通过LocatorCallback接口类去共同实现定位数据的获取,代码如下:
//上报设备定位信息
private MylocatorCallBack mylocatorCallBack = new MylocatorCallBack();
/**
* 手机定位器开启后,获取定位实时数据
*/
public void onLocationChangeListener() {
HiLog.info(hilog,"定位功能开始" );
// 定位类型,选择"导航场景"
RequestParam requestParam = new RequestParam(RequestParam.SCENE_NAVIGATION);
//实现 mylocatorCallBack 接口对象
mylocatorCallBack = new MylocatorCallBack();
HiLog.info(hilog,"开启定位" );
// 开启定位,获取定位数据
locator.startLocating(requestParam,mylocatorCallBack);
}
//地图控制器
private AMap aMap;
//日志信息
private static final HiLogLabel hilog = new HiLogLabel(HiLog.DEBUG, 0x0000, "APP_LOG");
/**
* 上报设备定位信息
* 需要注意:MylocatorCallBack是“内部类”,
* 把封装Amap对象的getLocation(location)方法
* 放到MylocatorCallBack类提供的onLocationReport(location)方法中,
* 即可调用并获取到设备实时发送的定位数据信息
*/
public class MylocatorCallBack implements LocatorCallback{
//获取定位数据
@Override
public void onLocationReport(Location location) {
HiLog.info(hilog,"AMap定位,Latitude为:" + location.getLatitude()+",Longitude为:" + location.getLongitude());
//绑定高德地图提供的Amap对象
getLocation(location);
}
@Override
public void onStatusChanged(int i) {
}
@Override
public void onErrorReport(int i) {
}
}
/**
* 获取当前坐标的经纬度值
*/
public void getLocation(Location location){
//通过高德地图提供的Amap对象,获取实时定位数据
LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,16));
}
从上面的代码块中,我们通过日志对象hilog来获取到onLocationReport(Location location)方法中对参数Location实时输出的设备定位值,如下图:
获取到onLocationReport(Location location)方法中的定位数据后,我们要把这些实时定位数据都绑定到高德地图SDK提供的对象Amap中,让Amap来实现高德地图的当前定位,在上面我是通过自己定义的getLocation(Location location)方法来实现。
/**
* MainAbilitySlice要实现LocationSource接口,获取OnLocationChangedListener监听器
*/
public class MainAbilitySlice extends AbilitySlice implements LocationSource{
//定位监听器
private OnLocationChangedListener mListener = null;
.
.
.
/**
* 获取当前坐标的经纬度值
*/
public void getLocation(Location location){
LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,16));
HiLog.info(hilog,"AMap定位,Latitude为:" + location.getLatitude()+",Longitude为:" + location.getLongitude());
//绘制定位图标-小蓝点的样式
getMyLocationStyle();
//通过监听器OnLocationChangedListener,触发小蓝点在地图上的出现
mListener.onLocationChanged(location);
}
/**
* 绘制定位点
*/
private void getMyLocationStyle(){
HiLog.info(hilog,"绘制定位小蓝点" );
MyLocationStyle locationStyle = new MyLocationStyle();//初始化定位蓝点样式
locationStyle.anchor(0.0f,1.0f);
aMap.setMyLocationStyle(locationStyle);
locationStyle.interval(1000);//设置连续定位模式下的的定位间隔,值在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒
// locationStyle.showMyLocation(true);
locationStyle.strokeColor(Color.BLUE); //圆圈的边框颜色为蓝色
locationStyle.radiusFillColor(Color.LTGRAY); //圆圈的填充颜色
locationStyle.strokeWidth(400);
aMap.setMyLocationStyle(locationStyle);
//设置定位蓝点的style
aMap.getUiSettings().setMyLocationButtonEnabled(false); // 设置默认定位按钮是否显示,非必须设置
aMap.setLocationSource(this);
aMap.setMyLocationEnabled(true);//设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false
}
/**
* 激活定位器
* @param onLocationChangedListener
* LocationSource接口实现方法
*/
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mListener = onLocationChangedListener;
}
/**
* 关闭定位器
* LocationSource接口实现方法
*/
@Override
public void deactivate() {
mListener = null;
}
}
在上面的代码中,我们自己的silice类需要通过LocationSource类来获取监听器OnLocationChangedListener,让监听器OnLocationChangedListener的onLocationChanged(location)方法去触发设备当前定位的图标-小蓝点在地图上能够显示,效果图如下:
如果你感觉这个小蓝点不是自己喜欢的样式风格,我们可以通过上面代码块中提供的MyLocationStyle这个对象来继续改变定位图标的样式风格,效果图如下:
当然,MyLocationStyle这个对象也必须绑定到高德地图提供的Amap对象里面,只有Amap对象才能让小蓝点在高德地图中进行显示。
想要让鸿蒙版开发环境中的APP项目实现高德地图的当前定位-带箭头的“小蓝点”,需要先获取到手机当前定位的数据信息,然后再通过高德地图提供的Amap对象来绑定当前定位的数据信息,让高德地图能够显示我们所在的附近信息。
而定位图标“小蓝点”想要在高德地图上进行显示,必须要有监听器OnLocationChangedListener来进行触发,触发的结果仍需要绑定Amap对象,这样才能让“小蓝点”真正标记我们的当前位置。
注意:以上关于鸿蒙版高德地图的定位“小蓝点”的实现,本人并没有进行相关定位“坐标偏移量”的处理,和实际上的定位功能仍有差异,需要你们自己去进一步进行功能优化。如果您对本篇内容需要进行详细了解,可在评论区进行留言。
页面更新:2024-05-21
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号