鴻蒙OS 獲取設(shè)備的位置信息

2020-09-18 15:51 更新

場景介紹

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

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

接口說明

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

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

開發(fā)步驟

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

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

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

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

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

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

   {
       "reqPermissions": [{
           "name": "ohos.permission.LOCATION",
           "reason": "$string:reason_description",
           "usedScene": {
               "ability": ["com.myapplication.LocationAbility"],
               "when": "inuse"
           }, {
           ...
           }]
       }]
   }

說明

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

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

   Locator locator = new Locator(context);

其中入?yún)⑿枰峁┊?dāng)前應(yīng)用程序的 AbilityInfo 信息,便于系統(tǒng)管理應(yīng)用的定位請求。

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

方式一:

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

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

以導(dǎo)航場景為例,實例化方式如下:

   RequestParam requestParam = new RequestParam(RequestParam.SCENE_NAVIGATION);

方式二:

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

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

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

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

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

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

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

   MyLocatorCallback locatorCallback = new MyLocatorCallback();

    
   public class MyLocatorCallback implements LocatorCallback {
       @Override
       public void onLocationReport(Location location) {
       }

    
       @Override
       public void onStatusChanged(int type) {
       }

    
       @Override
       public void onErrorReport(int type) {
       }
   }

  1. 啟動定位。

   locator.startLocating(requestParam, locatorCallback);

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

   locator.requestOnce(requestParam, locatorCallback);

  1. (可選)結(jié)束定位。

   locator.stopLocating(locatorCallback);

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

   locator.getCachedLocation();

此接口的使用需要應(yīng)用向用戶申請 LOCATION 位置權(quán)限。

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號