鴻蒙 Location Kit(位置服務)

移動終端設備已經深入人們日常生活的方方面面,如查看所在城市的天氣、新聞軼事、出行打車、旅行導航、運動記錄。這些習以為常的活動,都離不開定位用戶終端設備的位置。

Location Kit 使用多種定位技術提供服務,可以準確地確定設備在室外/室內的位置:

  • 坐標
    系統以 1984 年世界大地坐標系統為參考,使用經度、緯度、海拔高度數據描述地球上的一個位置。
  • GNSS 定位
    全球導航衛星系統,包含:GPS、GLONASS、北斗、Galileo 等,通過導航衛星、設備芯片提供的定位算法,來確定設備準確位置。定位過程具體使用哪些定位系統,取決于用戶設備的硬件能力。
  • 基站定位
    根據設備當前駐網基站和相鄰基站的位置,估算設備當前位置。此定位方式的定位結果精度相對較低,并且需要設備可以訪問蜂窩網絡。
  • WLAN、藍牙定位
    根據設備可搜索到的周圍 WLAN、藍牙設備位置,估算設備當前位置。此定位方式的定位結果精度依賴設備周圍可見的固定 WLAN、藍牙設備的分布,密度較高時,精度也相較于基站定位方式更高,同時也需要設備可以訪問網絡

申請定位權限

應用在使用 Location Kit 系統能力前,需要檢查是否已經獲取用戶授權訪問設備位置信息。如未獲得授權,可以向用戶申請需要的位置權限。系統提供的定位相關權限有:

  • ohos.permission.LOCATION:用于獲取精準位置,精準度在米級別
  • ohos.permission.APPROXIMATELY_LOCATION:用于獲取模糊位置,精確度為 5 公里
  • ohos.permission.LOCATION_IN_BACKGROUND:用于應用切換到后臺仍然需要獲取定位信息的場景

當 APP 運行在前臺,訪問設備位置信息時,申請位置權限的方式有兩種:
獲取模糊位置: ohos.permission.APPROXIMATELY_LOCATION
獲取精確位置: ohos.permission.APPROXIMATELY_LOCATION + ohos.permission.LOCATION

當 APP 運行在后臺時,除了上述兩組權限外,還需要申請如下權限:
后臺定位權限: ohos.permission.LOCATION_IN_BACKGROUND
或者申請定位類型的長時任務:backgroundModes: "location"

申請用戶權限

import {abilityAccessCtrl,bundleManager,common,Permissions,
} from "@kit.AbilityKit";let permissions: Permissions[] = ["ohos.permission.APPROXIMATELY_LOCATION","ohos.permission.LOCATION",
];let accessMgr = abilityAccessCtrl.createAtManager();
const flags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION;
const bundleInfo = await bundleManager.getBundleInfoForSelf(flags);
const grantStatus0 = await accessMgr.checkAccessToken(bundleInfo.appInfo.accessTokenId,permissions[0]
);
const grantStatus1 = await accessMgr.checkAccessToken(bundleInfo.appInfo.accessTokenId,permissions[1]
);if (grantStatus0 === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED &&grantStatus1 === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED
) {let results = await accessMgr.requestPermissionsFromUser(getContext(),permissions);if (results.authResults[0] == 0 && results.authResults[1] == 0) {// 通過授權} else {// 拒絕授權}
}

相關接口

接口名功能描述
on(type: 'locationChange', request: LocationRequest | ContinuousLocationRequest, callback: Callback<Location>): void開啟位置變化訂閱,并發起定位請求,持續性定位
off(type: 'locationChange', callback?: Callback<Location>): void關閉位置變化訂閱,并刪除對應的定位請求,如果不關閉就會產生內存泄漏
getCurrentLocation(request: CurrentLocationRequest | SingleLocationRequest, callback: AsyncCallback<Location>): void獲取當前位置,使用 callback 回調異步返回結果,一次性定位
getCurrentLocation(request?: CurrentLocationRequest | SingleLocationRequest): Promise<Location>獲取當前位置,使用 Promise 方式異步返回結果
getLastLocation(): Location獲取最近一次定位結果
isLocationEnabled(): boolean判斷位置服務是否已經開啟

示例

{"module":{"extensionAbilities":["requestPermissions": [//當前應用申請數據和功能的訪問權限//系統授予級權限 —— 只需要聲明name即可{"name": "ohos.permission.INTERNET"    //互聯網訪問權限},//用戶授予級權限 —— 必須聲明name/reason/usedScene三個屬性{"name": "ohos.permission.APPROXIMATELY_LOCATION",   //模糊定位"reason": "$string:Location_Reason","usedScene": {"abilities": ["EntryAbility"],"when": "always"}},{"name": "ohos.permission.LOCATION",  //精確定位"reason": "$string:Location_Reason", //當前應用需要向用戶解釋使用該權限的原因"usedScene": {                       //權限在何種場景下被使用"abilities": ["EntryAbility"],    //哪些Ability/窗口中需要使用該權限"when": "always"  //何時使用該權限  inuse:當前應用在前臺運行時需要使用   always:總是需要該權限,即使應用沒在運行}}]]}
}
import { abilityAccessCtrl, bundleManager, Permissions } from '@kit.AbilityKit'
import { geoLocationManager } from '@kit.LocationKit'
import { JSON } from '@kit.ArkTS'
import { router } from '@kit.ArkUI'@Entry
@Component
struct Index {//頁面顯式時,先彈出“申請定位權限”授權窗口async onPageShow() {//① 聲明需要用戶授權的權限列表let list: Permissions[] = ['ohos.permission.APPROXIMATELY_LOCATION', 'ohos.permission.LOCATION']//② 獲得當前應用的“訪問令牌”let flags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION //需要獲得整個應用的信息,而不是模塊的/應用組件的let bundleInfo = await bundleManager.getBundleInfoForSelf(flags) //得到當前資源包信息let tokenId = bundleInfo.appInfo.accessTokenId //當前應用的當前分身在當前用戶使用場景下,系統分配的令牌編號let atManager = abilityAccessCtrl.createAtManager() //At: Access Token,訪問令牌,即當前應用的授權列表let grantStatus0 = await atManager.checkAccessToken(tokenId, list[0])let grantStatus1 = await atManager.checkAccessToken(tokenId, list[1])//③ 從訪問令牌中查詢,用戶是否授予過定位權限if (grantStatus0 == -1 && grantStatus1 == -1) { //0表示已經通過授權了  -1表尚未尚未授權/之前拒絕授權了//④ 如果尚未授權過,則彈出申請授權對話框let result = await atManager.requestPermissionsFromUser(getContext(), list)if (result.authResults[0] == 0) {console.log('1.模糊定位權限已經從用戶處申請到')} else {console.log('2.用戶拒絕授予模糊定位權限')}if (result.authResults[1] == 0) {console.log('3.精確定位權限已經從用戶處申請到')} else {console.log('4.用戶拒絕授予精確定位權限')}}}//當頁面隱藏時,取消“持續性定位改變監聽”onPageHide() {try {geoLocationManager.off('locationChange')console.log('--持續性定位改變監聽已經關閉')} catch (err) {console.log('--關閉持續性定位改變監聽失敗:', JSON.stringify(err))}}build() {Column({ space: 10 }) {Text('首頁').fontSize(30)Button('1.獲取用戶當前的定位信息——一次性定位').onClick(async _ => {if (geoLocationManager.isLocationEnabled()) {console.log('--當前系統已打開定位開關,正在獲取位置信息....')let loc = await geoLocationManager.getCurrentLocation()console.log('--成功獲取到當前定位信息:', JSON.stringify(loc))if (geoLocationManager.isGeocoderAvailable()) {let address = await geoLocationManager.getAddressesFromLocation(loc)console.log('--當前系統可以進行地理<=>坐標轉化',address[0].placeName)} else {console.log('--當前系統無法進行地理<=>坐標轉化')}} else {console.log('--當前系統未啟用定位服務,請用戶打開定位開關!')}})Button('2.獲取用戶當前的定位信息——持續性定位').onClick(_ => {if (!geoLocationManager.isLocationEnabled()) {console.log('--當前系統沒有打開定位開關!')return}let count = 0geoLocationManager.on('locationChange', {}, (loc) => {count++console.log('--當前設備位置改變了:', count, JSON.stringify(loc))})})Button('3.跳轉到下一個頁面,測試是否仍然監聽定位改變').onClick(_ => {router.pushUrl({url: 'pages/Page1'})})}.height('100%').width('100%').padding(10)}
}

地理編碼

使用坐標描述一個位置,非常準確,但是并不直觀,面向用戶表達并不友好。系統向開發者提供了以下兩種轉化能力:

  • 地理編碼轉化:將地理描述轉化為具體坐標。
  • 逆地理編碼轉化:將坐標轉化為地理描述。

其中地理編碼包含多個屬性來描述位置,包括國家、行政區劃、街道、門牌號、地址描述等等,這樣的信息更便于用戶理解

import { geoLocationManager } from '@kit.LocationKit'try {if( geoLocationManager.isGeocoderAvailable() ){ //查詢地理編碼與逆地理編碼服務是否可用let loc = {"latitude": 31.12, "longitude": 121.11, ... }let addr = await geoLocationManager.getAddressesFromLocation( loc ) //逆地理編碼轉化}
} catch (err) {console.error("逆地理編碼轉化失敗:" + JSON.stringify(err));
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81888.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81888.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81888.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二叉樹深搜:在算法森林中尋找路徑

專欄&#xff1a;算法的魔法世界 個人主頁&#xff1a;手握風云 目錄 一、搜索算法 二、回溯算法 三、例題講解 3.1. 計算布爾二叉樹的值 3.2. 求根節點到葉節點數字之和 3.3. 二叉樹剪枝 3.4. 驗證二叉搜索樹 3.5. 二叉搜索樹中第 K 小的元素 3.6. 二叉樹的所有路徑 …

企業級AI搜索解決方案:阿里云AI搜索開放平臺

隨著信息技術的飛速發展&#xff0c;搜索引擎作為信息獲取的重要工具&#xff0c;扮演著不可或缺的角色。阿里云 AI 搜索開放平臺以其強大的技術支持和靈活的開放性&#xff0c;持續為用戶提供高效的搜索解決方案。 一、阿里云 AI 搜索開放平臺 一站式的 AI 搜索開放平臺作為…

自動駕駛中的預測控制算法:用 Python 讓無人車更智能

自動駕駛中的預測控制算法:用 Python 讓無人車更智能 自動駕駛技術近年來取得了令人驚嘆的進步,AI 與邊緣計算的結合讓車輛能夠實時感知環境、規劃路徑并執行駕駛決策。其中,預測控制(Model Predictive Control,MPC) 作為一種先進的控制算法,憑借其對未來駕駛行為的優化…

量子計算機超越超級計算機——它們解決了哪些問題?

“ 南加州大學的研究人員取得了重大突破&#xff0c;證明量子計算機在解決某些復雜問題時甚至可以勝過最快的超級計算機。” 量子退火最終顯示出擴展優勢&#xff0c;得益于錯誤抑制的量子處理&#xff0c;它比傳統超級計算機提供更快、接近最優的解決方案。 南加州大學的研究人…

Java虛擬機 -方法調用

方法調用 方法調用靜態鏈接動態鏈接案例虛方法與非虛方法虛方法&#xff08;Virtual Method&#xff09;非虛方法&#xff08;Non-Virtual Method&#xff09; 方法返回地址 方法調用 我們編寫Java程序的時候&#xff0c;我們自己寫的類通常不僅僅是調用自己本類的方法。調用別…

【 開源:跨平臺網絡數據傳輸的萬能工具libcurl】

在當今這個互聯互通的世界中&#xff0c;數據在各種設備和平臺之間自由流動&#xff0c;而 libcurl&#xff0c;就像一把跨平臺的萬能工具&#xff0c;為開發者提供了處理各種網絡數據傳輸任務所需的強大功能。它不僅是一個庫&#xff0c;更是一種通用的解決方案&#xff0c;可…

ElasticSearch 8.x 快速上手并了解核心概念

目錄 核心概念概念總結 常見操作索引的常見操作常見的數據類型指定索引庫字段類型mapping查看索引庫的字段類型最高頻使用的數據類型 核心概念 在新版Elasticsearch中&#xff0c;文檔document就是一行記錄(json)&#xff0c;而這些記錄存在于索引庫(index)中, 索引名稱必須是…

優化 CRM 架構,解鎖企業競爭力密碼

引言 “在所有企業面臨的挑戰中&#xff0c;客戶關系管理無疑是最為關鍵的一環。” —— 彼得德魯克 在數字化浪潮席卷的當下&#xff0c;企業面臨著前所未有的機遇與挑戰。客戶關系管理&#xff08;CRM&#xff09;作為企業運營的核心環節&#xff0c;其架構的優劣直接影響著…

深入理解Docker和K8S

深入理解Docker和K8S Docker 是大型架構的必備技能&#xff0c;也是云原生核心。Docker 容器化作為一種輕量級的虛擬化技術&#xff0c;其核心思想&#xff1a;將應用程序及其所有依賴項打包在一起&#xff0c;形成一個可移植的單元。 容器的本質是進程&#xff1a; 容器是在…

list.forEach(s -> countService.refreshArticleStatisticInfo(s.getId())); 講解一下語法

這段代碼使用了Java中的forEach方法結合Lambda表達式來遍歷一個列表&#xff0c;并對列表中的每個元素執行特定操作。具體來說&#xff0c;它會遍歷列表中的每一個元素&#xff0c;并調用countService.refreshArticleStatisticInfo(s.getId())方法來刷新每個文章的統計信息。下…

AI開發者的算力革命:GpuGeek平臺全景實戰指南(大模型訓練/推理/微調全解析)

目錄 背景一、AI工業化時代的算力困局與破局之道1.1 中小企業AI落地的三大障礙1.2 GpuGeek的破局創新1.3 核心價值 二、GpuGeek技術全景剖析2.1 核心架構設計 三、核心優勢詳解?3.1 優勢1&#xff1a;工業級顯卡艦隊???3.2 優勢2&#xff1a;開箱即用生態?3.2.1 預置鏡像庫…

05算法學習_59. 螺旋矩陣 II

05算法學習_59. 螺旋矩陣 II 05算法學習_59. 螺旋矩陣 II題目描述&#xff1a;個人代碼&#xff1a;學習思路&#xff1a;第一種寫法&#xff1a;題解關鍵點&#xff1a; 個人學習時疑惑點解答&#xff1a; 05算法學習_59. 螺旋矩陣 II 力扣題目鏈接: 59. 螺旋矩陣 II 題目描…

JDK7Hashmap的頭插法造成的環問題

單線程下的擴容 多線程下的擴容 next&#xff1d;e 然后e的next變成e

JAVA|后端編碼規范

目錄 零、引言 一、基礎 二、集合 三、并發 四、日志 五、安全 零、引言 規范等級&#xff1a; 【強制】&#xff1a;強制遵守&#xff0c;來源于線上歷史故障&#xff0c;將通過工具進行檢查。【推薦】&#xff1a;推薦遵守&#xff0c;來源于日常代碼審查、開發人員反饋…

2025-05-21 Python深度學習5——數據讀取

文章目錄 1 數據準備2 Dataset2.1 自定義 Dataset2.2 使用示例 3 TensorBoard3.1 安裝3.2 標量可視化&#xff08;Scalars&#xff09;3.3 圖像可視化&#xff08;Images&#xff09;3.4 其他常用功能 4 transform4.1 ToTensor()4.2 Normalize()4.3 Resize()4.4 Compose()4.5 C…

5月21日學習筆記

MYSQL三層結構 表1 數據庫DB1 表2 數據庫管理系統 客戶端命令終端&#xff08;Dos&#xff09; DBMS 數據庫DB2 表1 表2 數據庫………. Mysql數據庫-表的本質仍然是文件 表的一行稱之為一條記錄->在java程序中一行記錄往往使用對象表示 SQL語…

二十、面向對象底層邏輯-ServiceRegistry接口設計集成注冊中心

一、服務治理的基石接口 在微服務架構中&#xff0c;服務實例的動態注冊與發現是保證系統彈性的關鍵機制。Spring Cloud Commons模塊通過ServiceRegistry與Registration接口定義了服務注冊的標準化模型&#xff0c;為不同服務發現組件&#xff08;Eureka、Consul、Nacos等&…

DeepSeek:以開源之力,引領AI技術新風潮

在年春節&#xff0c;大語言模型DeepSeek如同一枚震撼彈&#xff0c;在全球范圍內引發了轟動&#xff0c;成功“破圈”&#xff0c;將中國的人工智能&#xff08;AI&#xff09;技術成果推向了世界舞臺。 開源策略&#xff1a;打破技術壁壘 在AI行業&#xff0c;OpenAI等巨頭…

完整改進RIME算法,基于修正多項式微分學習算子Rime-ice增長優化器,完整MATLAB代碼獲取

1 簡介 為了有效地利用霧狀冰生長的物理現象&#xff0c;最近開發了一種優化算法——霧狀優化算法&#xff08;RIME&#xff09;。它模擬硬霧狀和軟霧狀過程&#xff0c;構建硬霧狀穿刺和軟霧狀搜索機制。在本研究中&#xff0c;引入了一種增強版本&#xff0c;稱為修改的RIME…

PyTorch可視化工具——使用Visdom進行深度學習可視化

文章目錄 前置環境Visdom安裝并啟動VisdomVisdom圖形APIVisdom靜態更新API詳解通用參數說明使用示例Visdom動態更新API詳解1. 使用updateappend參數2. ~~使用vis.updateTrace方法~~3. 完整訓練監控示例 Visdom可視化操作散點圖plot.scatter()散點圖案例線性圖vis.line()vis.lin…