出行品類HarmonyOS高德地圖集成過程分享

??想了解更多關(guān)于開源的內(nèi)容,請訪問:??
項目背景
電動車因騎行方便、節(jié)省時間等優(yōu)勢,成為我們?nèi)粘3鲂械慕煌üぞ咧唬瑖鴥?nèi)電動車的需求數(shù)據(jù)龐大且逐年攀升。然而電動車頻繁被盜也不是新聞了,不僅給用戶帶來煩惱,也給警務(wù)工作增加負(fù)擔(dān)。如何制定一套提升用戶體驗又能兼顧高安全性的出行品類解決方案,是我們主要思考研究的方向。
為了提升及改善日常出行品類的用戶體驗,讓手機成為電動車鑰匙無感解鎖,我們想到可利用藍(lán)牙靠近發(fā)現(xiàn)的特性,采用無鑰匙解鎖控車作為主要功能,實現(xiàn)設(shè)備快速連接。但是常見的電動車、童車等出行類產(chǎn)品均在戶外使用,其安全性要求極高,雖然可利用藍(lán)牙技術(shù)進(jìn)行極簡連接控制,但由于藍(lán)牙本身具有開放廣播的特性,在設(shè)備附近的人都可以通過手機發(fā)現(xiàn)設(shè)備,則會帶來嚴(yán)重的安全隱患。
針對此問題,經(jīng)過反復(fù)推敲,最終決定利用安全秘鑰結(jié)合云服務(wù),在設(shè)備發(fā)現(xiàn)、連接操控進(jìn)行嚴(yán)格的操作認(rèn)證管控,實現(xiàn)極簡連接體驗和嚴(yán)格安全控車需求;結(jié)合GPS、電子地圖,實現(xiàn)設(shè)備的出行軌跡展示功能,動態(tài)計算設(shè)備的停留點、停留時間;采用出行產(chǎn)品電子圍欄技術(shù),用戶通過手機直接在電子地圖上圈定范圍區(qū)域,如果設(shè)備被移到范圍外,手機就會收到報警通知,防止車輛丟失。
邏輯實現(xiàn)
手機靠近電動車設(shè)備,手機藍(lán)牙打開在未連接的情況下,手機將彈出連接提示,連接后將跳轉(zhuǎn)至App,可綁定設(shè)備以及查看相關(guān)狀態(tài),綁定后通過手機一鍵控制開關(guān)。設(shè)定自動鎖車的時間,超過設(shè)定的時間限制,設(shè)備將會自動下電并設(shè)防。設(shè)置電子圍欄,下電設(shè)防之后,防盜報警裝置啟動,超出區(qū)域報警提示。
以下為App部分效果圖:



電子地圖采用高德地圖,接下來我們看HarmonyOS高德地圖集成程序具體實現(xiàn)過程:
1、為項目增加高德地圖依賴包
- 依賴包放入模塊src同級目錄libs。
- 基礎(chǔ)依賴:mapslibrary-release.har。
- 搜索功能:searchlibrary-release.har。
- 模塊build.gradle文件中配置。
implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])
...
}
聲明權(quán)限:模塊config.json文件中配置網(wǎng)絡(luò)權(quán)限。
"reqPermissions": [
{
"name": "ohos.permission.INTERNET"
}
]
...
在項目初始化-MyApplication.onInitialize() 方法中加入如下代碼啟用。
// 搜索
ServiceSettings.getInstance().setApiKey(key);
// 地圖
MapsInitializer.setApiKey(key);
key需在高德開放平臺-控制臺-應(yīng)用管理-我的應(yīng)用 中為應(yīng)用添加key,詳見:https://lbs.amap.com/api/harmonyos-sdk/guide/get-key。
2、創(chuàng)建地圖
xml中使用標(biāo)簽。
使用時建議將高度和寬度設(shè)為match_parent,如需更靈活使用則需要在代碼中創(chuàng)建。
ohos:id="$+id:mapview"
ohos:height="match_parent"
ohos:width="match_parent"
/>
MapView mapView = (MapView) findComponentById(ResourceTable.Id_mapview);
mapView.onCreate(null);
mapView.onResume();
AMap aMap = mapView.getMap();//地圖操作對象
代碼中創(chuàng)建。
final CameraPosition LUJIAZUI = new CameraPosition.Builder()
.target(new LatLng(31.238068, 121.501654)).zoom(18).build();
AMapOptions aOptions = new AMapOptions();
aOptions.rotateGesturesEnabled(false);//設(shè)置地圖是否可以通過手勢進(jìn)行旋轉(zhuǎn)。
aOptions.zoomGesturesEnabled(true);//設(shè)置地圖是否可以通過手勢進(jìn)行縮放。
aOptions.scrollGesturesEnabled(true);//設(shè)置地圖是否可以通過手勢滑動
aOptions.tiltGesturesEnabled(false);//設(shè)置地圖是否可以通過手勢傾斜(3D效果),默認(rèn)為true。
aOptions.compassEnabled(false);//設(shè)置指南針是否可用。
aOptions.scaleControlsEnabled(false);//設(shè)置地圖是否顯示比例尺,默認(rèn)為false。
aOptions.zoomControlsEnabled(true);//設(shè)置地圖是否允許縮放。
aOptions.camera(LUJIAZUI);//設(shè)置地圖初始化時的地圖窗口狀態(tài)
aOptions.logoPosition(AMapOptions.LOGO_POSITION_BOTTOM_LEFT);//logo位置
aOptions.mapType(AMap.MAP_TYPE_NORMAL);//MAP_TYPE_NIGHT 黑夜地圖,夜間模式,值為3
MapView mapView = new MapView(this, aOptions);
ComponentContainer.LayoutConfig layoutConfig = new ComponentContainer.LayoutConfig(
ComponentContainer.LayoutConfig.MATCH_PARENT,
AttrHelper.vp2px(700, this));
layoutConfig.setMarginTop(AttrHelper.vp2px(56, this));
directionalLayout.addComponent(mapView, layoutConfig);
mapView.onCreate(null);
mapView.onResume();
AMap aMap = mapView.getMap();
//縮放按鈕右側(cè)居中
aMap.getUiSettings().setZoomPosition(AMapOptions.ZOOM_POSITION_RIGHT_CENTER);
創(chuàng)建后不用時記得銷毀。
建議包含mapView的頁面單獨用一個PageAbility承載。
protected void onStop() {
super.onStop();
if (mapView != null) {
mapView.onDestroy();
}
}
3、常用配置
CameraPosition:
aMap.moveCamera(CameraUpdateFactory.newCameraPosition(
new CameraPosition.Builder()
.target(new LatLng(31.238068,121.501654)).zoom(18).build()));//地圖移動窗口
常用使用屬性:
(LatLng) target:當(dāng)前區(qū)域屏幕中心經(jīng)緯度坐標(biāo)。
(float) zoom:目標(biāo)可視區(qū)域的縮放級別(放大級別),3.0f時地圖可視區(qū)域最大、20.0f時地圖可視區(qū)域最小。
常用 Listener。
調(diào)用 aMap.setXXXListener() 設(shè)置。
OnMapLoadedListener 地圖加載完成監(jiān)聽接口。
AMapGestureListener 地圖手勢識別的回調(diào)接口(如禁用手勢,識別到相關(guān)手勢也會回調(diào),但OnCameraChangeListener不會觸發(fā))。
OnCameraChangeListener 地圖Camera狀態(tài)發(fā)生變化的監(jiān)聽接口.當(dāng)調(diào)用AMap.animateCamera(CameraUpdate)、AMap.moveCamera(CameraUpdate)及手勢操作地圖時會觸發(fā)該回調(diào)(即當(dāng)前可視窗口變化監(jiān)聽)。
UiSettings:
UiSettings uiSettings = aMap.getUiSettings()。
可設(shè)置地圖logo、比例尺、縮放按鈕、定位按鈕、指南針顯示,還可設(shè)置旋轉(zhuǎn)手勢、拖拽手勢、傾斜手勢、縮放手勢、雙指縮放手勢是否可用(屏蔽地圖底層操作)。
Projection:
用于屏幕像素點坐標(biāo)系統(tǒng)和地球表面經(jīng)緯度點坐標(biāo)系統(tǒng)之間的變換。
public LatLng fromScreenLocation(Point var1) //將屏幕坐標(biāo)轉(zhuǎn)換成地理坐標(biāo)。
public Point toScreenLocation(LatLng var1) //將地理坐標(biāo)轉(zhuǎn)換成屏幕坐標(biāo)
public VisibleRegion getVisibleRegion() //返回當(dāng)前可視區(qū)域(包含MapView四個角點的經(jīng)緯度坐標(biāo))坐標(biāo)信息。
4、常見問題解答
在開發(fā)過程中,我們經(jīng)常會遇到以下問題:
1.在xml使用標(biāo)簽再從代碼中獲取MapView對象,地圖已默認(rèn)初始化,默認(rèn)地圖中心為北京市,縮放級別為10.0f,需要調(diào)用aMap.moveCamera()方法將窗口移至我們想要的位置,aMap.moveCamera()方法會觸發(fā)OnCameraChangeListener監(jiān)聽。
2.Projection.toScreenLocation()方法是基于當(dāng)前窗口中心點及縮放級別計算的屏幕坐標(biāo),該坐標(biāo)可能會超出屏幕顯示區(qū)域,尤其是地圖初始化還未移動窗口時調(diào)用。
3.不太建議在監(jiān)聽回調(diào)接口中觸發(fā)其他監(jiān)聽,可能造成邏輯或優(yōu)先級沖突(如在AMapGestureListener監(jiān)聽回調(diào)中調(diào)用aMap.moveCamera()方法從而又觸發(fā)了OnCameraChangeListener監(jiān)聽)。
4.使用地圖后退出頁面,地圖出現(xiàn)在其他頁面底層,原因為地圖使用后未銷毀,建議包含mapView的頁面單獨用一個PageAbility承載,在Ability.onStop()方法中調(diào)用mapView的onDestroy()方法銷毀地圖。
























