位置開發(fā)概述
移動終端設(shè)備已經(jīng)深入人們?nèi)粘I畹姆椒矫婷?,如查看所在城市的天氣、新聞軼事、出行打車、旅行導(dǎo)航、運動記錄。這些習(xí)以為常的活動,都離不開定位用戶終端設(shè)備的位置。
當(dāng)用戶處于這些豐富的使用場景中時,系統(tǒng)的位置能力可以提供實時準(zhǔn)確的位置數(shù)據(jù)。對于開發(fā)者,設(shè)計基于位置體驗的服務(wù),也可以使應(yīng)用的使用體驗更貼近每個用戶。
當(dāng)應(yīng)用在實現(xiàn)基于設(shè)備位置的功能時,如:駕車導(dǎo)航,記錄運動軌跡等,可以調(diào)用該模塊的API接口,完成位置信息的獲取。
基本概念
位置能力用于確定用戶設(shè)備在哪里,系統(tǒng)使用位置坐標(biāo)標(biāo)示設(shè)備的位置,并用多種定位技術(shù)提供服務(wù),如GNSS定位、基站定位、WLAN/藍(lán)牙定位(基站定位、WLAN/藍(lán)牙定位后續(xù)統(tǒng)稱“網(wǎng)絡(luò)定位技術(shù)”)。通過這些定位技術(shù),無論用戶設(shè)備在室內(nèi)或是戶外,都可以準(zhǔn)確地確定設(shè)備位置。
-
坐標(biāo)
系統(tǒng)以1984年世界大地坐標(biāo)系統(tǒng)為參考,使用經(jīng)度、緯度數(shù)據(jù)描述地球上的一個位置。
-
GNSS定位
基于全球?qū)Ш叫l(wèi)星系統(tǒng),包含:GPS、GLONASS、北斗、Galileo等,通過導(dǎo)航衛(wèi)星、設(shè)備芯片提供的定位算法,來確定設(shè)備準(zhǔn)確位置。定位過程具體使用哪些定位系統(tǒng),取決于用戶設(shè)備的硬件能力。
-
基站定位
根據(jù)設(shè)備當(dāng)前駐網(wǎng)基站和相鄰基站的位置,估算設(shè)備當(dāng)前位置。此定位方式的定位結(jié)果精度相對較低,并且需要設(shè)備可以訪問蜂窩網(wǎng)絡(luò)。
-
WLAN、藍(lán)牙定位
根據(jù)設(shè)備可搜索到的周圍WLAN、藍(lán)牙設(shè)備位置,估算設(shè)備當(dāng)前位置。此定位方式的定位結(jié)果精度依賴設(shè)備周圍可見的固定WLAN、藍(lán)牙設(shè)備的分布,密度較高時,精度也相較于基站定位方式更高,同時也需要設(shè)備可以訪問網(wǎng)絡(luò)。
運作機制
位置能力作為系統(tǒng)為應(yīng)用提供的一種基礎(chǔ)服務(wù),需要應(yīng)用在所使用的業(yè)務(wù)場景,向系統(tǒng)主動發(fā)起請求,并在業(yè)務(wù)場景結(jié)束時,主動結(jié)束此請求,在此過程中系統(tǒng)會將實時的定位結(jié)果上報給應(yīng)用。
約束與限制
使用設(shè)備的位置能力,需要用戶進(jìn)行確認(rèn)并主動開啟位置開關(guān)。如果位置開關(guān)沒有開啟,系統(tǒng)不會向任何應(yīng)用提供位置服務(wù)。
設(shè)備位置信息屬于用戶敏感數(shù)據(jù),所以即使用戶已經(jīng)開啟位置開關(guān),應(yīng)用在獲取設(shè)備位置前仍需向用戶申請位置訪問權(quán)限。在用戶確認(rèn)允許后,系統(tǒng)才會向應(yīng)用提供位置服務(wù)。
獲取設(shè)備的位置信息
場景介紹
開發(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é)果。 |
onStatusChanged?(int type) |
獲取定位過程中的狀態(tài)信息。 |
onErrorReport?(int type) |
獲取定位過程中的錯誤信息。 |
startLocating(RequestParam request, LocatorCallback callback) |
向系統(tǒng)發(fā)起定位請求。 |
requestOnce(RequestParam request, LocatorCallback callback) |
向系統(tǒng)發(fā)起單次定位請求。 |
stopLocating(LocatorCallback callback) |
結(jié)束定位。 |
getCachedLocation() |
獲取系統(tǒng)緩存的位置信息。 |
開發(fā)步驟
- 應(yīng)用在使用系統(tǒng)能力前,需要檢查是否已經(jīng)獲取用戶授權(quán)訪問設(shè)備位置信息。如未獲得授權(quán),可以向用戶申請需要的位置權(quán)限,申請方式請參考動態(tài)申請權(quán)限開發(fā)步驟。系統(tǒng)提供的定位權(quán)限有:
訪問設(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)限,示例代碼如下:
- ohos.permission.LOCATION
- ohos.permission.LOCATION_IN_BACKGROUND
{
"module": {
"reqPermissions": [{
"name": "ohos.permission.LOCATION",
"reason": "$string:reason_description",
"usedScene": {
"ability": ["com.myapplication.LocationAbility"],
"when": "inuse"
}, {
...
}
]
}
}
- 實例化Locator對象,所有與基礎(chǔ)定位能力相關(guān)的功能API,都是通過Locator提供的。
Locator locator = new Locator(context);
實例化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)等強遮蔽定位場景下,無法提供準(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ā)。
實例化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) {
}
}
啟動定位
locator.startLocating(requestParam, locatorCallback);
如果應(yīng)用不需要持續(xù)獲取位置結(jié)果,可以使用如下方式啟動定位,系統(tǒng)會上報一次實時定位結(jié)果后,自動結(jié)束應(yīng)用的定位請求。應(yīng)用不需要執(zhí)行結(jié)束定位。
locator.requestOnce(requestParam, locatorCallback);
(可選)結(jié)束定位。
locator.stopLocating(locatorCallback);
如果應(yīng)用使用場景不需要實時的設(shè)備位置,可以獲取系統(tǒng)緩存的最近一次歷史定位結(jié)果。
locator.getCachedLocation();
此接口的使用需要應(yīng)用向用戶申請ohos.permission.LOCATION權(quán)限。
(逆)地理編碼轉(zhuǎn)化
場景介紹
使用坐標(biāo)描述一個位置,非常準(zhǔn)確,但是并不直觀,面向用戶表達(dá)并不友好。
系統(tǒng)向開發(fā)者提供了地理編碼轉(zhuǎn)化能力(將地理描述轉(zhuǎn)化為具體坐標(biāo)),以及逆地理編碼轉(zhuǎn)化能力(將坐標(biāo)轉(zhuǎn)化為地理描述)。其中地理編碼包含多個屬性來描述位置,包括國家、行政區(qū)劃、街道、門牌號、地址描述等等,這樣的信息更便于用戶理解。
接口說明
進(jìn)行坐標(biāo)和地理編碼信息的相互轉(zhuǎn)化,所使用的接口說明如下。
接口名 |
功能描述 |
---|---|
GeoConvert() |
創(chuàng)建GeoConvert實例對象。 |
GeoConvert(Locale locale) |
根據(jù)自定義參數(shù)創(chuàng)建GeoConvert實例對象。 |
getAddressFromLocation(double latitude, double longitude, int maxItems) |
根據(jù)指定的經(jīng)緯度坐標(biāo)獲取地理位置信息。緯度取值范圍為[-90, 90],經(jīng)度取值范圍為[-180, 180]。 |
getAddressFromLocationName?(String description, int maxItems) |
根據(jù)地理位置信息獲取相匹配的包含坐標(biāo)數(shù)據(jù)的地址列表。 |
getAddressFromLocationName?(String description, double minLatitude, double minLongitude, double maxLatitude, double maxLongitude, int maxItems) |
根據(jù)指定的位置信息和地理區(qū)域獲取相匹配的包含坐標(biāo)數(shù)據(jù)的地址列表。緯度取值范圍為[-90, 90],經(jīng)度取值范圍為[-180, 180]。 |
開發(fā)步驟
說明
GeoConvert需要訪問后端服務(wù),請確保設(shè)備聯(lián)網(wǎng),以進(jìn)行信息獲取。
- 實例化GeoConvert對象,所有與(逆)地理編碼轉(zhuǎn)化能力相關(guān)的功能API,都是通過GeoConvert提供的。
GeoConvert geoConvert = new GeoConvert();
如果需要根據(jù)自定義參數(shù)實例化GeoConvert對象,如語言、地區(qū)等,可以使用GeoConvert(Locale locale)。
- 獲取轉(zhuǎn)化結(jié)果。
- 調(diào)用getAddressFromLocation(double latitude, double longitude, int maxItems),坐標(biāo)轉(zhuǎn)化地理位置信息。
geoConvert.getAddressFromLocation(40.0, 116.0, 1);
參考接口API說明,應(yīng)用可以獲得與此坐標(biāo)匹配的GeoAddress列表,應(yīng)用可以根據(jù)實際使用需求,讀取相應(yīng)的參數(shù)數(shù)據(jù)。文章來源:http://www.zghlxwxcb.cn/news/detail-561390.html
- 調(diào)用getAddressFromLocation(double latitude, double longitude, int maxItems),坐標(biāo)轉(zhuǎn)化地理位置信息。
- 調(diào)用getAddressFromLocationName?(String description, int maxItems)位置描述轉(zhuǎn)化坐標(biāo)。
參考接口API說明,應(yīng)用可以獲得與位置描述相匹配的GeoAddress列表,其中包含對應(yīng)的坐標(biāo)數(shù)據(jù),請參考API使用。文章來源地址http://www.zghlxwxcb.cn/news/detail-561390.html
如果需要查詢的位置描述可能出現(xiàn)多地重名的請求,可以調(diào)用getAddressFromLocationName?(String description, double minLatitude, double minLongitude, double maxLatitude, double maxLongitude, int maxItems),通過設(shè)置一個經(jīng)緯度范圍,以高效地獲取期望的準(zhǔn)確結(jié)果。
geoConvert.getAddressFromLocationName("北京大興國際機場", 1);
geoConvert.getAddressFromLocationName("北京大興國際機場", 0.0, 0.0, 90.0, 180.0, 1);
到了這里,關(guān)于HarmonyOS學(xué)習(xí)路之開發(fā)篇—設(shè)備管理(位置開發(fā))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!