出行品類HarmonyOS高德地圖集成過(guò)程分享
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??
??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??
項(xiàng)目背景
電動(dòng)車(chē)因騎行方便、節(jié)省時(shí)間等優(yōu)勢(shì),成為我們?nèi)粘3鲂械慕煌üぞ咧?,?guó)內(nèi)電動(dòng)車(chē)的需求數(shù)據(jù)龐大且逐年攀升。然而電動(dòng)車(chē)頻繁被盜也不是新聞了,不僅給用戶帶來(lái)煩惱,也給警務(wù)工作增加負(fù)擔(dān)。如何制定一套提升用戶體驗(yàn)又能兼顧高安全性的出行品類解決方案,是我們主要思考研究的方向。
為了提升及改善日常出行品類的用戶體驗(yàn),讓手機(jī)成為電動(dòng)車(chē)鑰匙無(wú)感解鎖,我們想到可利用藍(lán)牙靠近發(fā)現(xiàn)的特性,采用無(wú)鑰匙解鎖控車(chē)作為主要功能,實(shí)現(xiàn)設(shè)備快速連接。但是常見(jiàn)的電動(dòng)車(chē)、童車(chē)等出行類產(chǎn)品均在戶外使用,其安全性要求極高,雖然可利用藍(lán)牙技術(shù)進(jìn)行極簡(jiǎn)連接控制,但由于藍(lán)牙本身具有開(kāi)放廣播的特性,在設(shè)備附近的人都可以通過(guò)手機(jī)發(fā)現(xiàn)設(shè)備,則會(huì)帶來(lái)嚴(yán)重的安全隱患。
針對(duì)此問(wèn)題,經(jīng)過(guò)反復(fù)推敲,最終決定利用安全秘鑰結(jié)合云服務(wù),在設(shè)備發(fā)現(xiàn)、連接操控進(jìn)行嚴(yán)格的操作認(rèn)證管控,實(shí)現(xiàn)極簡(jiǎn)連接體驗(yàn)和嚴(yán)格安全控車(chē)需求;結(jié)合GPS、電子地圖,實(shí)現(xiàn)設(shè)備的出行軌跡展示功能,動(dòng)態(tài)計(jì)算設(shè)備的停留點(diǎn)、停留時(shí)間;采用出行產(chǎn)品電子圍欄技術(shù),用戶通過(guò)手機(jī)直接在電子地圖上圈定范圍區(qū)域,如果設(shè)備被移到范圍外,手機(jī)就會(huì)收到報(bào)警通知,防止車(chē)輛丟失。
邏輯實(shí)現(xiàn)
手機(jī)靠近電動(dòng)車(chē)設(shè)備,手機(jī)藍(lán)牙打開(kāi)在未連接的情況下,手機(jī)將彈出連接提示,連接后將跳轉(zhuǎn)至App,可綁定設(shè)備以及查看相關(guān)狀態(tài),綁定后通過(guò)手機(jī)一鍵控制開(kāi)關(guān)。設(shè)定自動(dòng)鎖車(chē)的時(shí)間,超過(guò)設(shè)定的時(shí)間限制,設(shè)備將會(huì)自動(dòng)下電并設(shè)防。設(shè)置電子圍欄,下電設(shè)防之后,防盜報(bào)警裝置啟動(dòng),超出區(qū)域報(bào)警提示。
以下為App部分效果圖:
電子地圖采用高德地圖,接下來(lái)我們看HarmonyOS高德地圖集成程序具體實(shí)現(xiàn)過(guò)程:
1、為項(xiàng)目增加高德地圖依賴包
- 依賴包放入模塊src同級(jí)目錄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"
}
]
...
在項(xiàng)目初始化-MyApplication.onInitialize() 方法中加入如下代碼啟用。
// 搜索
ServiceSettings.getInstance().setApiKey(key);
// 地圖
MapsInitializer.setApiKey(key);
key需在高德開(kāi)放平臺(tái)-控制臺(tái)-應(yīng)用管理-我的應(yīng)用 中為應(yīng)用添加key,詳見(jiàn):https://lbs.amap.com/api/harmonyos-sdk/guide/get-key。
2、創(chuàng)建地圖
xml中使用標(biāo)簽。
使用時(shí)建議將高度和寬度設(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();//地圖操作對(duì)象
代碼中創(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è)置地圖是否可以通過(guò)手勢(shì)進(jìn)行旋轉(zhuǎn)。
aOptions.zoomGesturesEnabled(true);//設(shè)置地圖是否可以通過(guò)手勢(shì)進(jìn)行縮放。
aOptions.scrollGesturesEnabled(true);//設(shè)置地圖是否可以通過(guò)手勢(shì)滑動(dòng)
aOptions.tiltGesturesEnabled(false);//設(shè)置地圖是否可以通過(guò)手勢(shì)傾斜(3D效果),默認(rèn)為true。
aOptions.compassEnabled(false);//設(shè)置指南針是否可用。
aOptions.scaleControlsEnabled(false);//設(shè)置地圖是否顯示比例尺,默認(rèn)為false。
aOptions.zoomControlsEnabled(true);//設(shè)置地圖是否允許縮放。
aOptions.camera(LUJIAZUI);//設(shè)置地圖初始化時(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)建后不用時(shí)記得銷(xiāo)毀。
建議包含mapView的頁(yè)面單獨(dú)用一個(gè)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()));//地圖移動(dòng)窗口
常用使用屬性:
(LatLng) target:當(dāng)前區(qū)域屏幕中心經(jīng)緯度坐標(biāo)。
(float) zoom:目標(biāo)可視區(qū)域的縮放級(jí)別(放大級(jí)別),3.0f時(shí)地圖可視區(qū)域最大、20.0f時(shí)地圖可視區(qū)域最小。
常用 Listener。
調(diào)用 aMap.setXXXListener() 設(shè)置。
OnMapLoadedListener 地圖加載完成監(jiān)聽(tīng)接口。
AMapGestureListener 地圖手勢(shì)識(shí)別的回調(diào)接口(如禁用手勢(shì),識(shí)別到相關(guān)手勢(shì)也會(huì)回調(diào),但OnCameraChangeListener不會(huì)觸發(fā))。
OnCameraChangeListener 地圖Camera狀態(tài)發(fā)生變化的監(jiān)聽(tīng)接口.當(dāng)調(diào)用AMap.animateCamera(CameraUpdate)、AMap.moveCamera(CameraUpdate)及手勢(shì)操作地圖時(shí)會(huì)觸發(fā)該回調(diào)(即當(dāng)前可視窗口變化監(jiān)聽(tīng))。
UiSettings:
UiSettings uiSettings = aMap.getUiSettings()。
可設(shè)置地圖logo、比例尺、縮放按鈕、定位按鈕、指南針顯示,還可設(shè)置旋轉(zhuǎn)手勢(shì)、拖拽手勢(shì)、傾斜手勢(shì)、縮放手勢(shì)、雙指縮放手勢(shì)是否可用(屏蔽地圖底層操作)。
Projection:
用于屏幕像素點(diǎn)坐標(biāo)系統(tǒng)和地球表面經(jīng)緯度點(diǎn)坐標(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四個(gè)角點(diǎn)的經(jīng)緯度坐標(biāo))坐標(biāo)信息。
4、常見(jiàn)問(wèn)題解答
在開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)遇到以下問(wèn)題:
1.在xml使用標(biāo)簽再?gòu)拇a中獲取MapView對(duì)象,地圖已默認(rèn)初始化,默認(rèn)地圖中心為北京市,縮放級(jí)別為10.0f,需要調(diào)用aMap.moveCamera()方法將窗口移至我們想要的位置,aMap.moveCamera()方法會(huì)觸發(fā)OnCameraChangeListener監(jiān)聽(tīng)。
2.Projection.toScreenLocation()方法是基于當(dāng)前窗口中心點(diǎn)及縮放級(jí)別計(jì)算的屏幕坐標(biāo),該坐標(biāo)可能會(huì)超出屏幕顯示區(qū)域,尤其是地圖初始化還未移動(dòng)窗口時(shí)調(diào)用。
3.不太建議在監(jiān)聽(tīng)回調(diào)接口中觸發(fā)其他監(jiān)聽(tīng),可能造成邏輯或優(yōu)先級(jí)沖突(如在AMapGestureListener監(jiān)聽(tīng)回調(diào)中調(diào)用aMap.moveCamera()方法從而又觸發(fā)了OnCameraChangeListener監(jiān)聽(tīng))。
4.使用地圖后退出頁(yè)面,地圖出現(xiàn)在其他頁(yè)面底層,原因?yàn)榈貓D使用后未銷(xiāo)毀,建議包含mapView的頁(yè)面單獨(dú)用一個(gè)PageAbility承載,在Ability.onStop()方法中調(diào)用mapView的onDestroy()方法銷(xiāo)毀地圖。
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??