鴻蒙OS 獲取設備的位置信息

2020-09-18 15:51 更新

場景介紹

開發(fā)者可以調(diào)用 HarmonyOS 位置相關接口,獲取設備實時位置,或者最近的歷史位置。

對于位置敏感的應用業(yè)務,建議獲取設備實時位置信息。如果不需要設備實時位置信息,并且希望盡可能的節(jié)省耗電,開發(fā)者可以考慮獲取最近的歷史位置。

接口說明

獲取設備的位置信息,所使用的接口說明如下。

接口名 功能描述
Locator(Context context) 創(chuàng)建 Locator 實例對象。
RequestParam(int scenario) 根據(jù)定位場景類型創(chuàng)建定位請求的 RequestParam 對象。
onLocationReport(Location location) 獲取定位結果。
startLocating(RequestParam request, LocatorCallback callback) 向系統(tǒng)發(fā)起定位請求。
requestOnce(RequestParam request, LocatorCallback callback) 向系統(tǒng)發(fā)起單次定位請求。
stopLocating(LocatorCallback callback) 結束定位。
getCachedLocation() 獲取系統(tǒng)緩存的位置信息。

開發(fā)步驟

  1. 應用在使用系統(tǒng)能力前,需要檢查是否已經(jīng)獲取用戶授權訪問設備位置信息。如未獲得授權,可以向用戶申請需要的位置權限。

系統(tǒng)提供的定位權限有:

  • ohos.permission.LOCATION
  • ohos.permission.LOCATION_IN_BACKGROUND

訪問設備的位置信息,必須申請 ohos.permission.LOCATION 權限,并且獲得用戶授權。

如果應用在后臺運行時也需要訪問設備位置,除需要將應用聲明為允許后臺運行外,還必須申請 ohos.permission.LOCATION_IN_BACKGROUND 權限,這樣應用在切入后臺之后,系統(tǒng)依然可以繼續(xù)上報位置信息。

開發(fā)者可以在應用 config.json 文件中聲明所需要的權限,示例代碼如下:

  1. {
  2. "reqPermissions": [{
  3. "name": "ohos.permission.LOCATION",
  4. "reason": "$string:reason_description",
  5. "usedScene": {
  6. "ability": ["com.myapplication.LocationAbility"],
  7. "when": "inuse"
  8. }, {
  9. ...
  10. }]
  11. }]
  12. }

說明

配置字段詳細說明見權限開發(fā)指導。在使用系統(tǒng)位置能力時,向用戶動態(tài)申請位置權限,申請方式請參考動態(tài)申請權限開發(fā)步驟。

  1. 實例化 Locator 對象,所有與基礎定位能力相關的功能 API,都是通過 Locator 提供的。

  1. Locator locator = new Locator(context);

其中入?yún)⑿枰峁┊斍皯贸绦虻?AbilityInfo 信息,便于系統(tǒng)管理應用的定位請求。

  1. 實例化 RequestParam 對象,用于告知系統(tǒng)該向應用提供何種類型的位置服務,以及位置結果上報的頻率。

方式一:

為了面向開發(fā)者提供貼近其使用場景的 API 使用方式,系統(tǒng)定義了幾種常見的位置能力使用場景,并針對使用場景做了適當?shù)膬?yōu)化處理,應用可以直接匹配使用,簡化開發(fā)復雜度。系統(tǒng)當前支持場景如下表所示。

場景名稱 常量定義 說明
導航場景 SCENE_NAVIGATION 適用于在戶外定位設備實時位置的場景,如車載、步行導航。在此場景下,為保證系統(tǒng)提供位置結果精度最優(yōu),主要使用 GNSS 定位技術提供定位服務,結合場景特點,在導航啟動之初,用戶很可能在室內(nèi)、車庫等遮蔽環(huán)境, GNSS 技術很難提供位置服務。為解決此問題,我們會在 GNSS 提供穩(wěn)定位置結果之前,使用系統(tǒng)網(wǎng)絡定位技術,向應用提供位置服務,以在導航初始階段提升用戶體驗。此場景默認以最小 1 秒間隔上報定位結果,使用此場景的應用必須申請 ohos.permission.LOCATION 權限,同時獲得用戶授權。
軌跡跟蹤場景 SCENE_TRAJECTORY_TRACKING 適用于記錄用戶位置軌跡的場景,如運動類應用記錄軌跡功能。主要使用 GNSS 定位技術提供定位服務。此場景默認以最小 1 秒間隔上報定位結果,并且應用必須申請 ohos.permission.LOCATION 權限,同時獲得用戶授權。
出行約車場景 SCENE_CAR_HAILING 適用于用戶出行打車時定位當前位置的場景,如網(wǎng)約車類應用。此場景默認以最小 1 秒間隔上報定位結果,并且應用必須申請 ohos.permission.LOCATION 權限,同時獲得用戶授權。
生活服務場景 SCENE_DAILY_LIFE_SERVICE 生活服務場景,適用于不需要定位用戶精確位置的使用場景,如新聞資訊、網(wǎng)購、點餐類應用,做推薦、推送時定位用戶大致位置即可。此場景默認以最小 1 秒間隔上報定位結果,并且應用至少申請 ohos.permission.LOCATION 權限,同時獲得用戶授權。
無功耗場景 SCENE_NO_POWER 無功耗場景,適用于不需要主動啟動定位業(yè)務。系統(tǒng)在響應其他應用啟動定位業(yè)務并上報位置結果時,會同時向請求此場景的應用程序上報定位結果,當前的應用程序不產(chǎn)生定位功耗。此場景默認以最小 1 秒間隔上報定位結果,并且應用需要申請 ohos.permission.LOCATION 權限,同時獲得用戶授權。

以導航場景為例,實例化方式如下:

  1. RequestParam requestParam = new RequestParam(RequestParam.SCENE_NAVIGATION);

方式二:

如果定義的現(xiàn)有場景類型不能滿足所需的開發(fā)場景,系統(tǒng)提供了基本的定位優(yōu)先級策略類型。

策略類型 常量定義 說明
定位精度優(yōu)先策略 PRIORITY_ACCURACY 定位精度優(yōu)先策略主要以 GNSS 定位技術為主,在開闊場景下可以提供納米級的定位精度,具體性能指標依賴用戶設備的定位硬件能力,但在室內(nèi)等強遮蔽定位場景下,無法提供準確的位置服務。應用必須申請 ohos.permission.LOCATION 權限,同時獲得用戶授權。
快速定位優(yōu)先策略 PRIORITY_FAST_FIRST_FIX 快速定位優(yōu)先策略會同時使用GNSS定位、基站定位和 WLAN、藍牙定位技術,以便室內(nèi)和戶外場景下,通過此策略都可以獲得位置結果,當各種定位技術都有提供位置結果時,系統(tǒng)會選擇其中精度較好的結果返回給應用。因為對各種定位技術同時使用,對設備的硬件資源消耗較大,功耗也較大。應用必須申請 ohos.permission.LOCATION 權限,同時獲得用戶授權。
低功耗定位優(yōu)先策略 PRIORITY_LOW_POWER 低功耗定位優(yōu)先策略主要使用基站定位和 WLAN、藍牙定位技術,也可以同時提供室內(nèi)和戶外場景下的位置服務,因為其依賴周邊基站、可見 WLAN、藍牙設備的分布情況,定位結果的精度波動范圍較大,如果對定位結果精度要求不高,或者使用場景多在有基站、可見 WLAN、藍牙設備高密度分布的情況下,推薦使用,可以有效節(jié)省設備功耗。應用至少申請 ohos.permission.LOCATION 權限,同時獲得用戶授權。

以定位精度優(yōu)先策略為例,實例化方式如下:

  1. RequestParam requestParam = new RequestParam(RequestParam.PRIORITY_ACCURACY,0,0);

后兩個入?yún)⒂糜谙薅ㄏ到y(tǒng)向應用上報定位結果的頻率,分別為位置上報的最小時間間隔,和位置上報的最小距離間隔,開發(fā)者可以參考 API 具體說明進行開發(fā)。

  1. 實例化 LocatorCallback 對象,用于向系統(tǒng)提供位置上報的途徑。

應用需要自行實現(xiàn)系統(tǒng)定義好的回調(diào)接口,并將其實例化。系統(tǒng)在定位成功確定設備的實時位置結果時,會通過 onLocationReport 接口上報給應用。應用程序可以在 onLocationReport 接口的實現(xiàn)中完成自己的業(yè)務邏輯。

  1. MyLocatorCallback locatorCallback = new MyLocatorCallback();
  2. public class MyLocatorCallback implements LocatorCallback {
  3. @Override
  4. public void onLocationReport(Location location) {
  5. }
  6. @Override
  7. public void onStatusChanged(int type) {
  8. }
  9. @Override
  10. public void onErrorReport(int type) {
  11. }
  12. }

  1. 啟動定位。

  1. locator.startLocating(requestParam, locatorCallback);

如果應用不需要持續(xù)獲取位置結果,可以使用如下方式啟動定位,系統(tǒng)會上報一次實時定位結果后,自動結束應用的定位請求。應用不需要執(zhí)行結束定位。

  1. locator.requestOnce(requestParam, locatorCallback);

  1. (可選)結束定位。

  1. locator.stopLocating(locatorCallback);

如果應用使用場景不需要實時的設備位置,可以獲取系統(tǒng)緩存的最近一次歷史定位結果。

  1. locator.getCachedLocation();

此接口的使用需要應用向用戶申請 LOCATION 位置權限。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號