了解更多开源内容请访问:51CTO开源基础软件社区https://ost.51cto.com项目背景电动车已经成为我们日常的交通工具之一由于其方便和省时的优点。国内对电动汽车的需求巨大且逐年上升。不过,电动车被盗事件频发并不是新闻,这不仅给用户带来了困扰,也增加了警方的工作负担。如何制定一套提升用户体验同时兼顾高安全性的出行品类解决方案是我们的主要研究方向。为了提升和改善日常出行品类的用户体验,让手机成为电动车的无钥匙开锁,我们想到了利用蓝牙接近发现的特性,以无钥匙开锁和车控为主要功能,实现设备的快速连接。而电动车、童车等常见出行产品都是在户外使用,对安全性要求极高。虽然可以利用蓝牙技术进行最小的连接控制,但是由于蓝牙本身开放广播的特性,靠近设备的人可以通过手机发现设备,这会带来严重的安全隐患。针对该问题,经过反复推敲,最终决定采用安全密钥结合云服务,在设备发现和连接控制上进行严格的操作认证控制,以达到极简连接体验和严格的安全控制要求;结合GPS和电子地图,实现设备的行程轨迹显示功能,可以动态计算设备的停留点和停留时间;利用旅游产品的电子围栏技术,用户可以通过手机直接在电子地图上划定区域。如果设备移出范围,手机会收到报警通知,防止车辆丢失。逻辑实现手机靠近电动车设备。当手机蓝牙开启,手机未连接时,手机会弹出连接提示。连接后会跳转到App。您可以绑定设备并查看相关状态。.设置自动锁车的时间。如果超过设定的时限,设备将自动关机并设防。设置电子围栏,断电后防盗报警装置启动,越界报警提示。下面是App部分的效果图:电子地图使用的是高德地图,接下来我们看HarmonyOS高德地图集成方案的具体实现过程:1.在项目中添加高德地图依赖包,将依赖包放入模块src的同级目录libs。基本依赖:mapslibrary-release.har。搜索函数:searchlibrary-release.har。在模块build.gradle文件中配置。implementationfileTree(dir:'libs',include:['*.jar','*.har'])...}声明权限:在模块config.json文件中配置网络权限。"reqPermissions":[{"name":"ohos.permission.INTERNET"}]...在项目初始化-MyApplication.onInitialize()方法中添加如下代码即可启用。//搜索ServiceSettings.getInstance().setApiKey(key);//映射MapsInitializer.setApiKey(key);key需要在高德开放平台-控制台-应用管理-我的应用中添加到应用中,参见:https://lbs.amap.com/api/harmonyos-sdk/guide/get-key。2.创建地图xml中使用的标签。使用时,建议设置高宽为match_parent。如果需要更灵活的使用,需要在代码中创建。ohos:id="$+id:mapview"ohos:height="match_parent"ohos:width="match_parent"/>MapViewmapView=(MapView)findComponentById(ResourceTable.Id_mapview);mapView.onCreate(null);mapView.onResume();AMapaMap=mapView.getMap();//代码中创建的地图操作对象。finalCameraPosition陆家嘴=newCameraPosition.Builder().target(newLatLng(31.238068,121.501654)).zoom(18).build();AMapOptionsaOptions=newAMapOptions();aOptions.rotateGesturesEnabled(false);//设置地图是否可以通过手势旋转。aOptions.zoomGesturesEnabled(true);//设置地图是否可以通过手势缩放。aOptions.scrollGesturesEnabled(true);//设置地图是否可以手势滑动aOptions.tiltGesturesEnabled(false);//设置地图是否可以手势倾斜(3D效果),默认为true。aOptions.compassEnabled(false);//设置指南针是否可用。aOptions.scaleControlsEnabled(false);//设置是否在地图上显示比例尺,默认为false。aOptions.zoomControlsEnabled(true);//设置地图是否允许缩放。aOptions.camera(LUJIAZUI);//设置地图初始化时的地图窗口状态aOptions.logoPosition(AMapOptions.LOGO_POSITION_BOTTOM_LEFT);//logo位置aOptions.mapType(AMap.MAP_TYPE_NORMAL);//MAP_TYPE_NIGHT夜间地图,夜间模式,值为3MapViewmapView=newMapView(this,aOptions);ComponentContainer.LayoutConfiglayoutConfig=newComponentContainer.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT,AttrHelper.vp2px(700,this));layoutConfig.setMarginTop(AttrHelper.x);directionalLayout.addComponent(mapView,layoutConfig);mapView.onCreate(null);mapView.onResume();AMapaMap=mapView.getMap();//缩放按钮右侧居中aMap.getUiSettings().setZoomPosition(AMapOptions.ZOOM_POSITION_RIGHT_CENTER);创建后不用的时候记得销毁。建议包含mapView的页面由单个PageAbility托管。@OverrideprotectedvoidonStop(){super.onStop();if(mapView!=null){mapView.onDestroy();}}3.常用配置CameraPosition:aMap.moveCamera(CameraUpdateFactory.newCameraPosition(newCameraPosition.Builder().target(newLatLng(31.238068,121.501654)).zoom(18).build()));//常用属性地图移动窗口:(LatLng)target:当前区域屏幕中心的经纬度坐标。(float)zoom:目标可见区域的缩放级别(放大级别),地图最大可见区域在3.0f处,地图最小可见区域在20.0f处。常用的监听器。调用aMap.setXXXListener()进行设置。OnMapLoadedListener地图加载完成监听接口。AMapGestureListener是地图手势识别的回调接口(如果禁用手势,相关手势也会被回调,但不会触发OnCameraChangeListener)。OnCameraChangeListener地图相机状态变化的监听接口。当调用AMap.animateCamera(CameraUpdate)、AMap.moveCamera(CameraUpdate)和手势操作地图(即当前可视窗口变化监听)时会触发该回调。UiSettings:UiSettingsuiSettings=aMap.获取用户界面设置()。您可以设置地图标志、比例尺、缩放按钮、定位按钮和罗盘显示。还可以设置旋转手势、拖动手势、倾斜手势、缩放手势、捏合手势是否可用(遮挡地图底层)。投影:用于屏幕像素点坐标系与地球表面经纬度点坐标系之间的转换。publicLatLngfromScreenLocation(Pointvar1)//将屏幕坐标转换为地理坐标。publicPointtoScreenLocation(LatLngvar1)//将地理坐标转换为屏幕坐标publicVisibleRegiongetVisibleRegion()//返回当前可见区域的坐标信息(包括MapView四个角点的经纬度坐标)。四、常见问题在开发过程中,我们经常遇到以下问题:1、在xml中使用标签,然后从代码中获取MapView对象。地图已默认初始化。默认地图中心为北京,缩放级别为10.0f。我们需要调用aMap.moveCamera()方法将窗口移动到我们想要的位置,aMap.moveCamera()方法会触发OnCameraChangeListener监听。2、Projection.toScreenLocation()方法是根据当前窗口中心点和缩放级别计算出的屏幕坐标,可能会超出屏幕显示区域,尤其是在地图初始化还没有移动窗口的情况下。3、不建议在监听回调接口触发其他监听,可能会造成逻辑或优先级冲突(例如在AMapGestureListener监听回调中调用aMap.moveCamera()方法会触发OnCameraChangeListener监听)。4.使用地图后退出页面。地图出现在其他页面的底部。原因是地图在使用后没有被销毁。建议将包含mapView的页面托管在一个PageAbility中,在Ability.onStop()方法中调用mapView的onDestroy()方法销毁。地图。了解更多开源信息,请访问:51CTO开源基础软件社区https://ost.51cto.com。
