HarmonyOS之设备定位的使用与地理编码的转化
生活随笔
收集整理的這篇文章主要介紹了
HarmonyOS之设备定位的使用与地理编码的转化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、簡介
① 設備位置
- 移動終端設備已經深入人們日常生活的方方面面,如查看所在城市的天氣、新聞軼事、出行打車、旅行導航、運動記錄等,這些習以為常的活動,都離不開定位用戶終端設備的位置。
- 當用戶處于這些豐富的使用場景中時,系統的位置能力可以提供實時準確的位置數據。對于開發者,設計基于位置體驗的服務,也可以使應用的使用體驗更貼近每個用戶。
- 當應用在實現基于設備位置的功能時,如:駕車導航,記錄運動軌跡等,可以調用該模塊的 API 接口,完成位置信息的獲取。
② 基本概念
- 位置能力用于確定用戶設備在哪里,系統使用位置坐標標示設備的位置,并用多種定位技術提供服務,如 GNSS 定位、基站定位、WLAN/藍牙定位(基站定位、WLAN/藍牙定位后續統稱“網絡定位技術”)。通過這些定位技術,無論用戶設備在室內或是戶外,都可以準確地確定設備位置。
- 坐標:系統以 1984 年世界大地坐標系統為參考,使用經度、緯度數據描述地球上的一個位置。
- GNSS 定位:基于全球導航衛星系統,包含:GPS、GLONASS、北斗、Galileo 等,通過導航衛星、設備芯片提供的定位算法,來確定設備準確位置。定位過程具體使用哪些定位系統,取決于用戶設備的硬件能力。
- 基站定位:根據設備當前駐網基站和相鄰基站的位置,估算設備當前位置。此定位方式的定位結果精度相對較低,并且需要設備可以訪問蜂窩網絡。
- WLAN、藍牙定位:根據設備可搜索到的周圍 WLAN、藍牙設備位置,估算設備當前位置。此定位方式的定位結果精度依賴設備周圍可見的固定 WLAN、藍牙設備的分布,密度較高時,精度也相較于基站定位方式更高,同時也需要設備可以訪問網絡。
③ 應用與限制
- 位置能力作為系統為應用提供的一種基礎服務,需要應用在所使用的業務場景,向系統主動發起請求,并在業務場景結束時,主動結束此請求,在此過程中系統會將實時的定位結果上報給應用。
- 使用設備的位置能力,需要用戶進行確認并主動開啟位置開關。如果位置開關沒有開啟,系統不會向任何應用提供位置服務。
- 設備位置信息屬于用戶敏感數據,所以即使用戶已經開啟位置開關,應用在獲取設備位置前仍需向用戶申請位置訪問權限。在用戶確認允許后,系統才會向應用提供位置服務。
二、獲取設備的位置信息
① 應用場景
- 開發者可以調用 HarmonyOS 位置相關接口,獲取設備實時位置,或者最近的歷史位置。
- 對于位置敏感的應用業務,建議獲取設備實時位置信息。如果不需要設備實時位置信息,并且希望盡可能的節省耗電,開發者可以考慮獲取最近的歷史位置。
② 常用 API
- 獲取位置信息 API 功能:
| Locator(Context context) | 創建Locator實例對象 |
| RequestParam(int scenario) | 根據定位場景類型創建定位請求的RequestParam對象 |
| onLocationReport(Location location) | 獲取定位結果 |
| onStatusChanged?(int type) | 獲取定位過程中的狀態信息 |
| onErrorReport?(int type) | 獲取定位過程中的錯誤信息 |
| startLocating(RequestParam request, LocatorCallback callback) | 向系統發起定位請求 |
| requestOnce(RequestParam request, LocatorCallback callback) | 向系統發起單次定位請求 |
| stopLocating(LocatorCallback callback) | 結束定位 |
| getCachedLocation() | 獲取系統緩存的位置信息 |
③ 使用流程
- 應用在使用系統能力前,需要檢查是否已經獲取用戶授權訪問設備位置信息。如未獲得授權,可以向用戶申請需要的位置權限。
- 系統提供的定位權限有:
-
- ohos.permission.LOCATION
-
- ohos.permission.LOCATION_IN_BACKGROUND
- 訪問設備的位置信息,必須申請 ohos.permission.LOCATION 權限,并且獲得用戶授權。
- 如果應用在后臺運行時也需要訪問設備位置,除需要將應用聲明為允許后臺運行外,還必須申請 ohos.permission.LOCATION_IN_BACKGROUND 權限,這樣應用在切入后臺之后,系統可以繼續上報位置信息。
- 開發者可以在應用 config.json 文件中聲明所需要的權限,示例代碼如下:
- 實例化 Locator 對象,所有與基礎定位能力相關的功能 API,都是通過 Locator 提供的(其中入參需要提供當前應用程序的 AbilityInfo 信息,便于系統管理應用的定位請求)。
- 實例化 RequestParam 對象,用于告知系統該向應用提供何種類型的位置服務,以及位置結果上報的頻率。
-
- 方式一:為了面向開發者提供貼近其使用場景的 API 使用方式,系統定義了幾種常見的位置能力使用場景,并針對使用場景做了適當的優化處理,應用可以直接匹配使用,簡化開發復雜度。
-
- 系統當前支持場景如下表所示:
| 導航場景 | SCENE_NAVIGATION | 適用于在戶外定位設備實時位置的場景,如車載、步行導航。在此場景下,為保證系統提供位置結果精度最優,主要使用GNSS定位技術提供定位服務,結合場景特點,在導航啟動之初,用戶很可能在室內、車庫等遮蔽環境,GNSS技術很難提供位置服務。為解決此問題,我們會在GNSS提供穩定位置結果之前,使用系統網絡定位技術,向應用提供位置服務,以在導航初始階段提升用戶體驗。此場景默認以最小1秒間隔上報定位結果,使用此場景的應用必須申請 |
| 軌跡跟蹤場景 | SCENE_TRAJECTORY_TRACKING | 適用于記錄用戶位置軌跡的場景,如運動類應用記錄軌跡功能。主要使用GNSS定位技術提供定位服務。 此場景默認以最小1秒間隔上報定位結果,并且應用必須申請ohos.permission.LOCATION權限,同時獲得用戶授權 |
| 出行約車場景 | SCENE_CAR_HAILING | 適用于用戶出行打車時定位當前位置的場景,如網約車類應用。 此場景默認以最小1秒間隔上報定位結果,并且應用必須申請ohos.permission.LOCATION權限,同時獲得用戶授權 |
| 生活服務場景 | SCENE_DAILY_LIFE_SERVICE | 生活服務場景,適用于不需要定位用戶精確位置的使用場景,如新聞資訊、網購、點餐類應用,做推薦、推送時定位用戶大致位置即可。 此場景默認以最小1秒間隔上報定位結果,并且應用至少申請ohos.permission.LOCATION權限,同時獲得用戶授權 |
| 無功耗場景 | SCENE_NO_POWER | 無功耗場景,適用于不需要主動啟動定位業務。系統在響應其他應用啟動定位業務并上報位置結果時,會同時向請求此場景的應用程序上報定位結果,當前的應用程序不產生定位功耗。 此場景默認以最小1秒間隔上報定位結果,并且應用需要申請ohos.permission.LOCATION權限,同時獲得用戶授權 |
-
- 以導航場景為例,實例化方式如下:
-
- 方式二:如果定義的現有場景類型不能滿足所需的開發場景,系統提供了基本的定位優先級策略類型。
-
- 定位優先級策略類型說明:
| 定位精度優先策略 | PRIORITY_ACCURACY | 定位精度優先策略主要以GNSS定位技術為主,在開闊場景下可以提供米級的定位精度,具體性能指標依賴用戶設備的定位硬件能力,但在室內等強遮蔽定位場景下,無法提供準確的位置服務。 應用必須申請ohos.permission.LOCATION權限,同時獲得用戶授權。 |
| 快速定位優先策略 | PRIORITY_FAST_FIRST_FIX | 快速定位優先策略會同時使用GNSS定位、基站定位和WLAN、藍牙定位技術,以便室內和戶外場景下,通過此策略都可以獲得位置結果,當各種定位技術都有提供位置結果時,系統會選擇其中精度較好的結果返回給應用。因為對各種定位技術同時使用,對設備的硬件資源消耗較大,功耗也較大。 應用必須申請ohos.permission.LOCATION權限,同時獲得用戶授權。 |
| 低功耗定位優先策略 | PRIORITY_LOW_POWER | 低功耗定位優先策略主要使用基站定位和WLAN、藍牙定位技術,也可以同時提供室內和戶外場景下的位置服務,因為其依賴周邊基站、可見WLAN、藍牙設備的分布情況,定位結果的精度波動范圍較大,如果對定位結果精度要求不高,或者使用場景多在有基站、可見WLAN、藍牙設備高密度分布的情況下,推薦使用,可以有效節省設備功耗。 應用至少申請ohos.permission.LOCATION權限,同時獲得用戶授權 |
-
- 以定位精度優先策略為例,實例化方式如下:
-
- 后兩個入參用于限定系統向應用上報定位結果的頻率,分別為位置上報的最小時間間隔,和位置上報的最小距離間隔,開發者可以參考API具體說明進行開發。
- 實例化 LocatorCallback 對象,用于向系統提供位置上報的途徑。應用需要自行實現系統定義好的回調接口,并將其實例化。系統在定位成功確定設備的實時位置結果時,會通過 onLocationReport 接口上報給應用。應用程序可以在 onLocationReport 接口的實現中完成自己的業務邏輯。
- 啟動定位:
-
- 如果應用不需要持續獲取位置結果,可以使用如下方式啟動定位,系統會上報一次實時定位結果后,自動結束應用的定位請求。應用不需要執行結束定位。
- (可選)結束定位:
-
- 如果應用使用場景不需要實時的設備位置,可以獲取系統緩存的最近一次歷史定位結果(此接口的使用需要應用向用戶申請 ohos.permission.LOCATION 權限)。
三、(逆)地理編碼轉化
① 應用場景
- 使用坐標描述一個位置,非常準確,但是并不直觀,面向用戶表達并不友好。
- 系統向開發者提供了地理編碼轉化能力(將坐標轉化為地理編碼信息),以及逆地理編碼轉化能力(將地理描述轉化為具體坐標)。其中地理編碼包含多個屬性來描述位置,包括國家、行政區劃、街道、門牌號、地址描述等等,這樣的信息更便于用戶理解。
② 地理編碼轉化 API
- 進行坐標和地理編碼信息的相互轉化,所使用的接口說明如下:
| GeoConvert() | 創建GeoConvert實例對象 |
| GeoConvert(Locale locale) | 根據自定義參數創建GeoConvert實例對象 |
| getAddressFromLocation(double latitude, double longitude, int maxItems) | 根據指定的經緯度坐標獲取地理位置信息。緯度取值范圍為[-90, 90],經度取值范圍為[-180, 180] |
| getAddressFromLocationName?(String description, int maxItems) | 根據地理位置信息獲取相匹配的包含坐標數據的地址列表 |
| getAddressFromLocationName?(String description, double minLatitude, double minLongitude, double maxLatitude, double maxLongitude, int maxItems) | 根據指定的位置信息和地理區域獲取相匹配的包含坐標數據的地址列表。緯度取值范圍為[-90, 90],經度取值范圍為[-180, 180] |
③ 地理編碼轉化流程
- 實例化 GeoConvert 對象,所有與(逆)地理編碼轉化能力相關的功能API,都是通過 GeoConvert 提供的(如果需要根據自定義參數實例化 GeoConvert 對象,如語言、地區等,可以使用 GeoConvert(Locale locale)):
- 獲取轉化結果:
-
- 調用 getAddressFromLocation(double latitude, double longitude, int maxItems), 坐標轉化地理位置信息:
-
- 調用 getAddressFromLocationName?(String description, int maxItems) 位置描述轉化坐標。
-
- 如果需要查詢的位置描述可能出現多地重名的請求,可以調用 getAddressFromLocationName?(String description, double minLatitude, double minLongitude, double maxLatitude, double maxLongitude, int maxItems),通過設置一個經緯度范圍,以高效地獲取期望的準確結果。
總結
以上是生活随笔為你收集整理的HarmonyOS之设备定位的使用与地理编码的转化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HarmonyOS之系统设置项的查询和使
- 下一篇: HarmonyOS之设备传感器的功能和使