前言
地圖定位功能相信很多人都用過,在鴻蒙的應用程序開發中,使用高德地圖的定位功能變得十分常見,那么在鴻蒙中一次完整的地位功能怎么實現?如果定位失敗了,能否獲取前幾次的定位呢?本篇文章帶你實現一個完整的定位功能流程,建議點贊收藏!
需求分析
要想實現一個完整的定位需求流程,就必須要做好準備工作,了解實現需求的具體步驟。
- 權限申請
- 檢查 GPS 是否打開
- 單次定位還是多次定位
- 定位失敗處理
技術實現
要想實現一次完整的定位流程,必須根據需要分析一步步去實現,由于高德地圖的引入太過于簡單,這里一筆帶過。重點講解完整實現的步驟。
- 添加基本定位權限,在 entry 模塊下的 module.json5 中添加定位必要的兩個權限。
{
// user_grant
"name": "ohos.permission.APPROXIMATELY_LOCATION",
"reason": "$string:location_permissions_reason",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "always"
}
},
{
// user_grant
"name": "ohos.permission.LOCATION",
"reason": "$string:location_permissions_reason",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "always"
}
},
- 在頁面中進行權限申請,一般是在 onPageShow 生命周期方法中申請,先檢查系統 GPS 定位開關是否開啟,如果沒有開啟則提示用戶跳轉到系統指定位置打開。
let location = geoLocationManager.isLocationEnabled()
if (!location) {
let dialog = new OpenSystemGPSEHelper()
dialog.show(this.getUIContext(),getContext(this) as common.UIAbilityContext,()= >{
this.currentCity = "定位失敗"
})
}
//GPS跳轉頁面
context.startAbility(
{
bundleName: "com.huawei.hmos.settings",
abilityName: "com.huawei.hmos.settings.MainAbility",
uri: "location_manager_settings"
},
- 確認 GPS 打開之后,開始 申請 用戶權限。
static applyPermission(context: common.UIAbilityContext, permissions: Array< Permissions >, grantedBlock: () = > void,
deniedBlock?: () = > void) {
let atManager = abilityAccessCtrl.createAtManager()
let permissionGrantedNumber: number = 0
atManager.requestPermissionsFromUser(context, permissions).then((data) = > {
for (let index = 0; index < data.authResults.length; index++) {
if (data.authResults[index] == 0) {
permissionGrantedNumber++;
}
}
if (permissionGrantedNumber == permissions.length) {
grantedBlock()
} else {
if (deniedBlock) {
deniedBlock()
} else {
PermissionUtil.openPermissionsInSystemSettings(context)
}
}
})
}
- 如果用戶打開權限,則直接開始定位服務,否則提示用戶跳轉到系統指定位置打開權限。
let wantInfo: Want = {
bundleName: 'com.huawei.hmos.settings',
abilityName: 'com.huawei.hmos.settings.MainAbility',
uri: 'application_info_entry',
parameters: {
settingsParamBundleName: bundleInfo.name
}
}
context.startAbility(wantInfo).then(() = > {
})
- 確認定位權限沒問題后,開始定位,高德提供的定位有多次和單次,這里使用單次定位。
let listener: IAMapLocationListener = {
onLocationChanged: (location) = > {
console.log("當前定位1:"+location.latitude+",---longitude:"+location.longitude)
this.transformCity(location.latitude,location.longitude)
}, onLocationError: (error) = > {
}
};
LocationManager.getInstance().addListener(listener)
LocationManager.getInstance().initLocation()
// 定位參數配置
let options: AMapLocationOption = {
//定位優先配置選項
priority: geoLocationManager.LocationRequestPriority.FIRST_FIX,
//定位場景設置
scenario: geoLocationManager.LocationRequestScenario.UNSET,
//定位精度 單位:米
maxAccuracy: 0,
//指定單次定位超時時間
singleLocationTimeout: 3000,
//定位是否返回逆地理信息
locatingWithReGeocode: true,
//逆地址語言類型
reGeocodeLanguage: AMapLocationReGeocodeLanguage.Chinese,
isOffset: false //是否加偏
}
// 設置配置
this.locationManger?.setLocationOption(AMapLocationType.Single, options)
if (this.listener != undefined) {
// 監聽
this.locationManger?.setLocationListener(AMapLocationType.Single, this.listener)
}
// 啟動定位
this.locationManger?.requestSingleLocation()
- 定位成功拿到定位的信息,在實際開發中盡管設置中已經設置返回逆地理信息,但并沒有返回具體信息,這點實在是無法理解,只能得到當前位置的經緯度。這個時候需要將經緯度轉換為當前位置名稱。
- 在開發中通過使用華為官方系統中的 api,對經緯度進行逆編碼才能獲取準備的位置名稱。
let reverseGeocodeRequest:geoLocationManager.ReverseGeoCodeRequest = {"latitude":latitude, "longitude":longitude, "maxItems": 1};
try {
geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest, (err, data) = > {})
- 如果地圖定位失敗,則可以根據高德地圖提供的方法,嘗試拿取歷史定位信息。
LocationManager.getInstance().getLastLocation({
onLocationChanged: (location) = > {
console.info('地圖定位緩存獲取成功: ' + JSON.stringify(location))
if (success) {
success()
}
}, onLocationError: (e) = > {
console.info('地圖定位緩存獲取失敗: ' + JSON.stringify(e))
if (success) {
success()
}
}
})
- 如果歷史定位信息也獲取失敗,這時就能使用默認定位位置了。
總結
定位功能實現起來比較簡單,但是完整的定位流程及細節處理才是本篇文章的關鍵,相信看完本篇文章你已經學會在鴻蒙中怎么使用高德定位功能了,快去動手嘗試一下吧!
審核編輯 黃宇
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
定位
+關注
關注
5文章
1405瀏覽量
35830 -
HarmonyOS
+關注
關注
79文章
2054瀏覽量
32167
發布評論請先 登錄
相關推薦
熱點推薦
高德地圖攜手雷鳥創新打造新一代AI+AR智能導航解決方案
近日,高德地圖與雷鳥創新RayNeo宣布達成戰略合作,雙方將深度融合人工智能體和空間交互等前沿技術框架,共同打造新一代AI+AR智能導航解決方案。此次合作,標志著高
HarmonyOS5云服務技術分享--登錄郵件功能整理
服務中的??郵箱登錄認證??功能,基于ArkTS API 12實現。無論你是剛接觸HarmonyOS生態,還是想優化現有登錄流程,這篇文章都將用清晰的代碼示例和通俗的講解,帶你搞定郵箱認證的完
發表于 05-22 16:04
高德地圖與Rokid達成合作
近日,高德地圖與Rokid宣布達成合作,將共同推出基于全場景智能眼鏡Rokid Glasses的全球首個導航智能體(NaviAgent)應用,標志著高
高德與華為簽署合作協議
近日北京高德云信科技有限公司與華為數字能源技術有限公司在上海簽署合作協議。雙方將依托自身優勢及重點領域,通過華為超充與高德地圖的深入合作,共
高質量 HarmonyOS 權限管控流程
高質量 HarmonyOS 權限管控流程 在 HarmonyOS 應用開發過程中,往往會涉及到 敏感數據 和 硬件資源 的調動和訪問,而這部分的調用就會涉及到管控這部分的知識和內容了。我們需要對它有

高德地圖與長城汽車共建出行聯合創新LAB
近日,高德地圖與長城汽車在河北舉行出行聯合創新LAB揭牌儀式,雙方將圍繞導航出行領域展開深度合作,共創未來用戶智慧出行新體驗。與此同時,基于高德
長城汽車聯手高德地圖打造出行聯合創新LAB
近日,長城汽車與高德地圖基于長期良好的合作基礎,聯手打造的“出行聯合創新LAB”正式在保定市長城汽車技術中心揭牌。根據共同約定,雙方將通過出行聯合創新LAB,發揮各自優勢,共同研究、探索基于用戶出行
HarmonyOS應用點擊完成時延問題定位流程及原理
在HarmonyOS應用開發中,完成時延是指用戶操作HarmonyOS移動終端時,從輸入觸控指令到界面完全刷新結束并達到可以閱讀的穩定狀態所用時間,點擊完成時延依據頁面轉場類型可以分為頁面內跳轉

淺談芯片制造的完整流程
在科技日新月異的今天,芯片作為信息技術的核心部件,其制作工藝的復雜性和精密性令人嘆為觀止。從一粒普通的沙子到一顆蘊含無數晶體管的高科技芯片,這一過程不僅凝聚了人類智慧的結晶,也展現了現代半導體工業的極致工藝。本文將講述芯片制造的完整流程,揭開這一高科技產品的神秘面紗。

德科智控獲得DEKRA德凱ISO 26262:2018 ASIL-D功能安全流程認證證書
近日,天津德科智控股份有限公司(以下簡稱“德科智控”)順利通過ISO 26262:2018 ASIL-D汽車功能安全管理體系認證,并獲得由DEKRA德凱頒發的
高德地圖率先入駐華為原生鴻蒙,實現跨終端無縫導航
在近日舉辦的華為開發者大會2024上,華為正式公布了其最新的操作系統HarmonyOS NEXT,并面向開發者和先鋒用戶啟動了Beta版。而在這一重要時刻,高德地圖宣布成為首批登陸原生
評論