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

2020-09-18 15:51 更新

場(chǎng)景介紹

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

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

接口說(shuō)明

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

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

開(kāi)發(fā)步驟

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

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

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

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

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

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

  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. }

說(shuō)明

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

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

  1. Locator locator = new Locator(context);

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

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

方式一:

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

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

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

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

方式二:

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

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

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

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

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

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

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

  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. 啟動(dòng)定位。

  1. locator.startLocating(requestParam, locatorCallback);

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

  1. locator.requestOnce(requestParam, locatorCallback);

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

  1. locator.stopLocating(locatorCallback);

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

  1. locator.getCachedLocation();

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)