




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第11章設(shè)備管理引言本章學(xué)習(xí)目標(biāo)了解HarmonyOS傳感器基本概念和架構(gòu)熟悉HarmonyOS傳感器的開發(fā)步驟2掌握獲取設(shè)備位置信息及地理編碼轉(zhuǎn)化的實現(xiàn)11.1傳感器的概念11.2傳感器開發(fā)步驟11.3位置開發(fā)概述11.4獲取設(shè)備位置信息11.5地理編碼轉(zhuǎn)化11.6案例11.7地圖開發(fā)CONTENTS11.1.1傳感器架構(gòu)4HarmonyOS傳感器包含4個模塊:SensorAPI、SensorFramework、SensorService和HD-IDL層。HarmonyOS傳感器的架構(gòu)圖如圖所示。11.1.1傳感器架構(gòu)5傳感器架構(gòu)分為以下幾層:SensorAPI:提供傳感器的基礎(chǔ)API,主要包含查詢傳感器的列表、訂閱/取消傳感器的數(shù)據(jù)、執(zhí)行控制命令等,簡化應(yīng)用開發(fā)。SensorFramework:主要實現(xiàn)傳感器的訂閱管理,數(shù)據(jù)通道的創(chuàng)建、銷毀、訂閱與取消訂閱,實現(xiàn)與SensorService的通信。SensorService:主要實現(xiàn)HD_IDL層數(shù)據(jù)接收、解析、分發(fā),前后臺的策略管控,對該設(shè)備Sensor的管理,Sensor權(quán)限管控等。HD-IDL層:對不同的FIFO、頻率進(jìn)行策略選擇,以及對不同設(shè)備的適配。11.1.1傳感器架構(gòu)6各種傳感器可實現(xiàn)功能:通過方向傳感器數(shù)據(jù),可以感知用戶設(shè)備當(dāng)前的朝向,從而達(dá)到為用戶指明方位的目的。通過重力和陀螺儀傳感器數(shù)據(jù),能感知設(shè)備傾斜和旋轉(zhuǎn)量,提高用戶在游戲場景中的體驗。通過接近光傳感器數(shù)據(jù),感知距離遮擋物的距離,使設(shè)備能夠自動亮滅屏,達(dá)到防誤觸目的。通過氣壓計傳感器數(shù)據(jù),可以準(zhǔn)確的判斷設(shè)備當(dāng)前所處的海拔。通過環(huán)境光傳感器數(shù)據(jù),設(shè)備能夠?qū)崿F(xiàn)背光自動調(diào)節(jié)。通過霍爾傳感器數(shù)據(jù),設(shè)備可以實現(xiàn)皮套功能等。11.1.1傳感器架構(gòu)7約束與限制:
針對某些傳感器,開發(fā)者需要請求相應(yīng)的權(quán)限,才能獲取相應(yīng)傳感器的數(shù)據(jù)。表展示的是傳感器權(quán)限。重點(diǎn)提示:傳感器數(shù)據(jù)訂閱和取消訂閱接口成對調(diào)用,當(dāng)不再需要訂閱傳感器數(shù)據(jù)時,開發(fā)者需要調(diào)用取消訂閱接口進(jìn)行資源釋放。傳感器權(quán)限名敏感級別權(quán)限描述加速度傳感器、加速度未校準(zhǔn)傳感器、線性加速度傳感器ohos.permission.ACCELEROMETERsystem_grant允許訂閱Motion組對應(yīng)的加速度傳感器的數(shù)據(jù)陀螺儀傳感器、陀螺儀未校準(zhǔn)傳感器ohos.permission.GYROSCOPEsystem_grant允許訂閱Motion組對應(yīng)的陀螺儀傳感器的數(shù)據(jù)計步器ohos.permission.ACTIVITY_MOTIONuser_grant允許訂閱運(yùn)動狀態(tài)心率ohos.permission.READ_HEALTH_DATAuser_grant允許讀取健康數(shù)據(jù)11.1.2開發(fā)傳感器時用到的接口8HarmonyOS傳感器提供的功能有:查詢傳感器的列表、訂閱/取消訂閱傳感器數(shù)據(jù)、查詢傳感器的最小采樣時間間隔、執(zhí)行控制命令。以訂閱方向類別的傳感器數(shù)據(jù)為例,本節(jié)示例涉及的接口如表所示。CategoryOrientationAgent的主要接口接口名描述getAllSensors()獲取屬于方向類別的傳感器列表。getAllSensors(int)獲取屬于方向類別中特定類型的傳感器列表。getSingleSensor(int)查詢方向類別中特定類型的默認(rèn)sensor(如果存在多個則返回第一個)。setSensorDataCallback(ICategoryOrientationDataCallback,CategoryOrientation,long)以設(shè)定的采樣間隔訂閱給定傳感器的數(shù)據(jù)。setSensorDataCallback(ICategoryOrientationDataCallback,CategoryOrientation,long,long)以設(shè)定的采樣間隔和時延訂閱給定傳感器的數(shù)據(jù)。releaseSensorDataCallback(ICategoryOrientationDataCallback,CategoryOrientation)取消訂閱指定傳感器的數(shù)據(jù)。releaseSensorDataCallback(ICategoryOrientationDataCallback)取消訂閱的所有傳感器數(shù)據(jù)。11.1.2開發(fā)傳感器時用到的接口9SensorAgent的主要接口CategoryOrientationData的主要接口接口名描述getSensorMinSampleInterval(int)查詢給定傳感器的最小采樣間隔。runCommand(int,int,int)針對某個傳感器執(zhí)行命令,刷新傳感器的數(shù)據(jù)。接口名描述getDeviceRotationMatrix(float[],float[])根據(jù)旋轉(zhuǎn)矢量獲取旋轉(zhuǎn)矩陣。getDeviceOrientation(float[],float[])根據(jù)旋轉(zhuǎn)矩陣獲取設(shè)備的方向。11.1傳感器的概念11.2傳感器開發(fā)步驟11.3位置開發(fā)概述11.4獲取設(shè)備位置信息11.5地理編碼轉(zhuǎn)化11.6案例11.7地圖開發(fā)CONTENTS11.2傳感器開發(fā)步驟11傳感器的分類傳感器有運(yùn)動類傳感器、環(huán)境類傳感器、方向類傳感器、光線類傳感器、健康類傳感器、其他類傳感器,這里舉一些常見的傳感器以及其對應(yīng)的代碼:運(yùn)動類:SENSOR_TYPE_ACCELEROMETER:加速度傳感器,測量三個物理軸(x、y和z)上,施加在設(shè)備上的加速度(包括重力加速度),單位:m/s2,可檢測運(yùn)動狀態(tài)。SENSOR_TYPE_LINEAR_ACCELERATION:線性加速度傳感器,作用同上,可檢測每個單軸方向上的線性加速度。SENSOR_TYPE_PEDOMETER_DETECTION:計步器檢測傳感器,檢測用戶的計步動作;如果取值為1則代表用戶產(chǎn)生了計步行走的動作;取值為0則代表用戶沒有發(fā)生運(yùn)動,可用于檢測用戶是否有計步的動作。SENSOR_TYPE_PEDOMETER:計步器傳感器,統(tǒng)計用戶的行走步數(shù),可用于提供用戶行走的步數(shù)數(shù)據(jù)。環(huán)境類:SENSOR_TYPE_MAGNETIC_FIELD:磁場傳感器,測量三個物理軸向(x、y、z)上,環(huán)境地磁場,單位:μT,可用來創(chuàng)建指南針。方向類:SENSOR_TYPE_ORIENTATION:方向傳感器,測量設(shè)備圍繞所有三個物理軸(x、y、z)旋轉(zhuǎn)的角度值,單位:rad,可用于提供屏幕旋轉(zhuǎn)的3個角度值。健康類:SENSOR_TYPE_HEART_RATE:心率傳感器,測量用戶的心率數(shù)值,可用于提供用戶的心率健康數(shù)據(jù)。11.2傳感器開發(fā)步驟12如果讀者需要HarmonyOS支持的所有傳感器列表,可查詢開發(fā)者聯(lián)盟官網(wǎng)指南。有些傳感器的使用需要權(quán)限,如果設(shè)備上使用了傳感器權(quán)限列表中的傳感器,需要請求相應(yīng)的權(quán)限,開發(fā)者才能獲取到傳感器數(shù)據(jù)。不同敏感級別的傳感器舉例如下表所示。敏感級別傳感器權(quán)限名權(quán)限描述system_grant加速度傳感器、加速度未校準(zhǔn)傳感器、線性加速度傳感器ohos.permission.ACCELEROMETER允許訂閱Motion組對應(yīng)的加速度傳感器的數(shù)據(jù)。user_grant計步器ohos.permission.ACTIVITY_MOTION允許訂閱運(yùn)動狀態(tài)。11.2傳感器開發(fā)步驟13權(quán)限配置開發(fā)者需要在config.json里面配置權(quán)限:開發(fā)者如果需要獲取加速度的數(shù)據(jù),需要進(jìn)行如下權(quán)限配置。"reqPermissions":[{"name":"ohos.permission.ACCELEROMETER","reason":"","usedScene":{"ability":[".MainAbility"],"when":"inuse"}}]11.2傳感器開發(fā)步驟14對于需要用戶授權(quán)的權(quán)限,如計步器傳感器,需要進(jìn)行如下權(quán)限配置。"reqPermissions":[{"name":"ohos.permission.ACTIVITY_MOTION","reason":"","usedScene":{"ability":[".MainAbility"],"when":"inuse"}}]11.2傳感器開發(fā)步驟15由于敏感權(quán)限需要用戶授權(quán),因此,開發(fā)者在應(yīng)用啟動時或者調(diào)用訂閱數(shù)據(jù)接口前,需要調(diào)用權(quán)限檢查和請求權(quán)限接口。@OverridepublicvoidonStart(Intentintent){super.onStart(intent);if(verifySelfPermission("ohos.permission.ACTIVITY_MOTION")!=0){if(canRequestPermission("ohos.permission.ACTIVITY_MOTION")){requestPermissionsFromUser(newString[]{"ohos.permission.ACTIVITY_MOTION"},1);}}//...}11.2傳感器開發(fā)步驟16@OverridepublicvoidonRequestPermissionsFromUserResult(intrequestCode,String[]permissions,int[]grantResults){//匹配requestPermissionsFromUser的requestCodeif(requestCode==1){if(grantResults.length>0&&grantResults[0]==0){//權(quán)限被授予
}else{//權(quán)限被拒絕
}}}11.2傳感器開發(fā)步驟17傳感器的使用以使用方向類、運(yùn)動類的傳感器為例,環(huán)境類、健康類等類別的傳感器使用方法與其類似。獲取待訂閱數(shù)據(jù)的傳感器。創(chuàng)建傳感器回調(diào)。訂閱傳感器數(shù)據(jù)。接收并處理傳感器數(shù)據(jù)。取消訂閱傳感器數(shù)據(jù)。下面介紹計步器傳感器和方向傳感器的開發(fā)過程。創(chuàng)建一個名為SensorDemo的應(yīng)用,創(chuàng)建兩個Page:PedometerAbility、DirectionAbility分別對應(yīng)運(yùn)動類計步器傳感器和方向類方向傳感器的開發(fā)使用。計步器傳感器頁面有兩個Butotn組件和一個Text組件,分別是用來訂閱/取消訂閱傳感器數(shù)據(jù)和將獲取的“步數(shù)”數(shù)據(jù)顯示出來。方向類方向傳感器頁面與之類似,只不過Text組件的作用是將獲取的“方向”數(shù)據(jù)顯示出來,這里對XML文件中的內(nèi)容不再贅述。11.2.1案例:計步器傳感器18本小節(jié)介紹計步器傳感器的開發(fā)過程,創(chuàng)建一個名為PedometerSensorDemo的應(yīng)用來演示。因為計步器傳感器的使用需要請求“允許訂閱運(yùn)動狀態(tài)”權(quán)限才可以獲取相應(yīng)的傳感器數(shù)據(jù),且該權(quán)限為敏感權(quán)限,所以還需要進(jìn)行動態(tài)申請,config.json文件中請求權(quán)限部分代碼如下:"reqPermissions":[{"name":"ohos.permission.ACTIVITY_MOTION"}]在MainAbility文件中的onStart()方法里進(jìn)行動態(tài)申請,其內(nèi)容如下:11.2.1案例:計步器傳感器19publicclassMainAbilityextendsAbility{@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setMainRoute(MainAbilitySlice.class.getName());if(verifySelfPermission("ohos.permission.ACTIVITY_MOTION")!=0){if(canRequestPermission("ohos.permission.ACTIVITY_MOTION")){requestPermissionsFromUser(newString[]{"ohos.permission.ACTIVITY_MOTION"},1);}}}@OverridepublicvoidonRequestPermissionsFromUserResult(intrequestCode,String[]permissions,int[]grantResults){//匹配requestPermissionsFromUser的requestCodeif(requestCode==1){if(grantResults.length>0&&grantResults[0]==0){//權(quán)限被授予
}else{//權(quán)限被拒絕
}}}}11.2.1案例:計步器傳感器20修改MainAbilitySlice,其內(nèi)容如下:publicclassMainAbilitySliceextendsAbilitySlice{//定義日志標(biāo)簽
staticfinalHiLogLabelLABEL=newHiLogLabel(HiLog.LOG_APP,0x00922,"MainAbilitySlice");//運(yùn)動類傳感器代理對象
privateCategoryMotionAgentcategoryMotionAgent;//運(yùn)動類傳感器對象
privateCategoryMotioncategoryMotion;privateTextText_Result;privateintStep=0;@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);//初始化組件
InitComponent();}11.2.1案例:計步器傳感器21//初始化組件
publicvoidInitComponent(){//找到組件
Text_Result=findComponentById(ResourceTable.Id_Text_Result);ButtonButton_Start=findComponentById(ResourceTable.Id_Button_Start);ButtonButton_Stop=findComponentById(ResourceTable.Id_Button_Stop);//給Button_Start添加單擊事件
Button_Start.setClickedListener(this::Start);//給Button_Stop添加單擊事件
Button_Stop.setClickedListener(this::Stop);}//訂閱傳感器數(shù)據(jù)
publicvoidStart(Componentcomponent){categoryMotionAgent=newCategoryMotionAgent();//獲取計步器傳感器,統(tǒng)計用戶的行走步數(shù)
categoryMotion=categoryMotionAgent.getSingleSensor(CategoryMotion.SENSOR_TYPE_PEDOMETER);//訂閱計步器傳感器
categoryMotionAgent.setSensorDataCallback(iCategoryMotionDataCallback,categoryMotion,SensorAgent.SENSOR_SAMPLING_RATE_UI);}11.2.1案例:計步器傳感器22//取消訂閱傳感器數(shù)據(jù)
privatevoidStop(Componentcomponent){//取消訂閱計步器檢測傳感器
categoryMotionAgent.releaseSensorDataCallback(iCategoryMotionDataCallback,categoryMotion);}//運(yùn)動類傳感器數(shù)據(jù)回調(diào)
privatefinalICategoryMotionDataCallbackiCategoryMotionDataCallback=newICategoryMotionDataCallback(){@OverridepublicvoidonSensorDataModified(CategoryMotionDatacategoryMotionData){HiL(LABEL,"onSensorDataModified()方法被調(diào)用");Step++;getUITaskDispatcher().asyncDispatch(()->{Text_Result.setText(Step+"");});}
11.2.1案例:計步器傳感器23 @OverridepublicvoidonAccuracyDataModified(CategoryMotioncategoryMotion,inti){}@OverridepublicvoidonCommandCompleted(CategoryMotioncategoryMotion){}}; @Override publicvoidonActive(){super.onActive(); } @Override publicvoidonForeground(Intentintent){super.onForeground(intent);}}11.2.1案例:計步器傳感器24上述代碼中:在訂閱傳感器數(shù)據(jù)按鈕的單擊事件中,首先獲取了運(yùn)動類傳感器代理對象categoryMotionAgent,接著通過getSingleSensor()方法得到計步器傳感器對象categoryMotion,最后通過setSensorDataCallback()回調(diào)訂閱計步器傳感器,其三個參數(shù)分別是:傳感器數(shù)據(jù)回調(diào)對象、運(yùn)動類傳感器對象、采樣頻率模式。采樣頻率模式有四種分別是:SENSOR_SAMPLING_RATE_FASTEST:表示獲取傳感器數(shù)據(jù)的最快采樣速率。SENSOR_SAMPLING_RATE_GAME:表示在游戲場景中獲取傳感器數(shù)據(jù)的采樣率。SENSOR_SAMPLING_RATE_NORMAL:指示獲取傳感器數(shù)據(jù)的默認(rèn)采樣率,例如在屏幕旋轉(zhuǎn)的情況下。SENSOR_SAMPLING_RATE_UI:指示在UI上獲取傳感器數(shù)據(jù)的采樣率。onAccuracyDataModified()方法是當(dāng)數(shù)據(jù)精度發(fā)生變化時進(jìn)行回調(diào)。onCommandCompleted()方法是當(dāng)傳感器命令執(zhí)行完成時回調(diào)。11.2.1案例:計步器傳感器25運(yùn)行程序,點(diǎn)擊“允許應(yīng)用訪問您的健身運(yùn)動”權(quán)限,單擊“訂閱傳感器數(shù)據(jù)”按鈕,記錄結(jié)果如圖所示11.2.2案例:方向傳感器26本小節(jié)介紹方向傳感器的開發(fā)過程,創(chuàng)建一個名為DirectionSensorDemo的應(yīng)用來演示。方向傳感器的使用不需要申請權(quán)限。修改MainAbilitySlice,詳細(xì)代碼參考11.2.2節(jié)內(nèi)容。運(yùn)行程序,應(yīng)用初始頁面如圖所示。11.1傳感器的概念11.4獲取設(shè)備位置信息11.5地理編碼轉(zhuǎn)化11.6案例11.7地圖開發(fā)CONTENTS11.3位置開發(fā)概述28移動設(shè)備已深入人們?nèi)粘I畹母鱾€方面,如天氣、新聞、出行、導(dǎo)航和運(yùn)動記錄。系統(tǒng)的位置能力能提供實時的位置信息,為開發(fā)者設(shè)計基于位置的服務(wù)提供可能性,提升用戶體驗。通過GNSS、基站、WLAN/藍(lán)牙等多種技術(shù),設(shè)備在室內(nèi)外均可準(zhǔn)確定位。1.基本概念坐標(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ò)。11.3位置開發(fā)概述292.運(yùn)作機(jī)制坐標(biāo):位置能力作為系統(tǒng)為應(yīng)用提供的一種基礎(chǔ)服務(wù),需要應(yīng)用在所使用的業(yè)務(wù)場景,向系統(tǒng)主動發(fā)起請求,并在業(yè)務(wù)場景結(jié)束時,主動結(jié)束此請求,在此過程中系統(tǒng)會將實時的定位結(jié)果上報給應(yīng)用。3.約束與限制使用設(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ù)。開發(fā)者可以調(diào)用HarmonyOS位置相關(guān)接口,獲取設(shè)備實時位置,或者最近的歷史位置。對于位置敏感的應(yīng)用業(yè)務(wù),建議獲取設(shè)備實時位置信息。如果不需要設(shè)備實時位置信息,并且希望盡可能的節(jié)省耗電,開發(fā)者可以考慮獲取最近的歷史位置11.1傳感器的概念11.4獲取設(shè)備位置信息11.5地理編碼轉(zhuǎn)化11.6案例11.7地圖開發(fā)CONTENTS11.4獲取設(shè)備位置信息31應(yīng)用在使用系統(tǒng)能力前,需要檢查是否已經(jīng)獲取用戶授權(quán)訪問設(shè)備位置信息。如未獲得授權(quán),可以向用戶申請需要的位置權(quán)限。系統(tǒng)提供的定位權(quán)限有:ohos.permission.LOCATIONohos.permission.LOCATION_IN_BACKGROUND訪問設(shè)備的位置信息,必須申請ohos.permission.LOCATION權(quán)限,并且獲得用戶授權(quán)。如果應(yīng)用在后臺運(yùn)行時也需要訪問設(shè)備位置,除需要將應(yīng)用聲明為允許后臺運(yùn)行外,還必須申請ohos.permission.LOCATION_IN_BACKGROUND權(quán)限,這樣應(yīng)用在切入后臺之后,系統(tǒng)可以繼續(xù)上報位置信息。11.4獲取設(shè)備位置信息32下面以獲取設(shè)備的位置信息為例介紹具體開發(fā)過程開發(fā)者可以在應(yīng)用config.json文件中聲明所需要的權(quán)限,示例代碼如下:{"module":{"reqPermissions":[{"name":"ohos.permission.LOCATION","reason":"$string:reason_description","usedScene":{"ability":["com.myapplication.LocationAbility"],"when":"inuse"},{...}]}}11.4獲取設(shè)備位置信息33實例化Locator對象,所有與基礎(chǔ)定位能力相關(guān)的功能API,都是通過Locator提供的。Locatorlocator=newLocator(context);實例化RequestParam對象,用于告知系統(tǒng)該向應(yīng)用提供何種類型的位置服務(wù),以及位置結(jié)果上報的頻率。實例化LocatorCallback對象,用于向系統(tǒng)提供位置上報的途徑。示例代碼如下:MyLocatorCallbacklocatorCallback=newMyLocatorCallback();
publicclassMyLocatorCallbackimplementsLocatorCallback{
@Override publicvoidonLocationReport(Locationlocation){ }
@Override publicvoidonStatusChanged(inttype){ }
@Override publicvoidonErrorReport(inttype){ }}11.4獲取設(shè)備位置信息34啟動定位locator.startLocating(requestParam,locatorCallback);結(jié)束定位(可選)如果應(yīng)用不需要持續(xù)獲取位置結(jié)果,可以使用如下方式啟動定位,系統(tǒng)會上報一次實時定位結(jié)果后,自動結(jié)束應(yīng)用的定位請求。應(yīng)用不需要執(zhí)行結(jié)束定位。locator.requestOnce(requestParam,locatorCallback);locator.stopLocating(locatorCallback);如果應(yīng)用使用場景不需要實時的設(shè)備位置,可以獲取系統(tǒng)緩存的最近一次歷史定位結(jié)果。locator.getCachedLocation();此接口的使用需要應(yīng)用向用戶申請ohos.permission.LOCATION權(quán)限。11.1傳感器的概念11.4獲取設(shè)備位置信息11.6案例11.7地圖開發(fā)CONTENTS11.5地理編碼轉(zhuǎn)化36系統(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(Localelocale)根據(jù)自定義參數(shù)創(chuàng)建GeoConvert實例對象。getAddressFromLocation(doublelatitude,doublelongitude,intmaxItems)根據(jù)指定的經(jīng)緯度坐標(biāo)獲取地理位置信息。緯度取值范圍為[-90,90],經(jīng)度取值范圍為[-180,180]。getAddressFromLocationName?(Stringdescription,intmaxItems)根據(jù)地理位置信息獲取相匹配的包含坐標(biāo)數(shù)據(jù)的地址列表。getAddressFromLocationName?(Stringdescription,doubleminLatitude,doubleminLongitude,doublemaxLatitude,doublemaxLongitude,intmaxItems)根據(jù)指定的位置信息和地理區(qū)域獲取相匹配的包含坐標(biāo)數(shù)據(jù)的地址列表。緯度取值范圍為[-90,90],經(jīng)度取值范圍為[-180,180]。11.5地理編碼轉(zhuǎn)化37地理編碼轉(zhuǎn)化開發(fā)步驟如下:實例化GeoConvert對象,所有與(逆)地理編碼轉(zhuǎn)化能力相關(guān)的功能API,都是通過GeoConvert提供的。GeoConvertgeoConvert=newGeoConvert();geoConvert.getAddressFromLocation(40.0,116.0,1);獲取轉(zhuǎn)化結(jié)果。調(diào)用getAddressFromLocation(doublelatitude,doublelongitude,intmaxItems),坐標(biāo)轉(zhuǎn)化地理位置信息。調(diào)用getAddressFromLocationName(Stringdescription,intmaxItems)位置描述轉(zhuǎn)化坐標(biāo)。geoConvert.getAddressFromLocationName("北京大興國際機(jī)場",1);參考開發(fā)者官網(wǎng)接口API說明,可以獲得與位置描述相匹配的GeoAddress列表,其中包含對應(yīng)坐標(biāo)數(shù)據(jù)11.1傳感器的概念11.4獲取設(shè)備位置信息11.7地圖開發(fā)CONTENTS11.6案例:獲取設(shè)備位置信息及逆地理編碼轉(zhuǎn)化39創(chuàng)建一個名為LocationDemo的應(yīng)用來演示獲取設(shè)備位置信息及逆地理編碼轉(zhuǎn)化。使用獲取設(shè)備位置信息功能時需要申請權(quán)限,在config.json文件中的請求代碼如下:"reqPermissions":[{"name":"ohos.permission.LOCATION"},{"name":"ohos.permission.LOCATION_IN_BACKGROUND"}]因為ohos.permission.LOCATION為敏感權(quán)限,需要進(jìn)行動態(tài)申請,在MainAbility中申請位置權(quán)限代碼如下:11.6案例:獲取設(shè)備位置信息及逆地理40publicclassMainAbilityextendsAbility{@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setMainRoute(MainAbilitySlice.class.getName());if(verifySelfPermission("ohos.permission.LOCATION")!=IBundleManager.PERMISSION_GRANTED){//應(yīng)用未被授予權(quán)限
if(canRequestPermission("ohos.permission.LOCATION")){//是否可以申請彈框授權(quán)(首次申請或者用戶未選擇禁止且不再提示)requestPermissionsFromUser(newString[]{"ohos.permission.LOCATION"},1);}else{//顯示應(yīng)用需要權(quán)限的理由,提示用戶進(jìn)入設(shè)置授權(quán)
}}else{//權(quán)限已被授予
}}11.6案例:獲取設(shè)備位置信息及逆地理41@OverridepublicvoidonRequestPermissionsFromUserResult(intrequestCode,String[]permissions,int[]grantResults){switch(requestCode){case1:{//匹配requestPermissions的requestCodeif(grantResults.length>0&&grantResults[0]==IBundleManager.PERMISSION_GRANTED){//權(quán)限被授予
//注意:因時間差導(dǎo)致接口權(quán)限檢查時有無權(quán)限
//所以對那些因無權(quán)限而拋異常的接口進(jìn)行異常捕獲處理
}else{//權(quán)限被拒絕
}return;}}}}11.6案例:獲取設(shè)備位置信息及逆地理編碼轉(zhuǎn)化42修改MainAbilitySlice,其內(nèi)容如下:publicclassMainAbilitySliceextendsAbilitySlice{//定義日志標(biāo)簽
staticfinalHiLogLabelLABEL=newHiLogLabel(HiLog.LOG_APP,0x00922,"MainAbilitySlice");privateTextText_Result;//經(jīng)度
privatedoubleLongitude;//緯度
privatedoubleLatitude;@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);//初始化組件
InitComponent();}11.6案例:獲取設(shè)備位置信息及逆地理編碼轉(zhuǎn)化43//初始化組件
privatevoidInitComponent(){HiL(LABEL,"InitComponent()方法被調(diào)用");//找到組件
ButtonButton_Get=findComponentById(ResourceTable.Id_Button_Get);ButtonButton_Transform=findComponentById(ResourceTable.Id_Button_Transform);Text_Result=findComponentById(ResourceTable.Id_Text_Result);//給Button_Get添加單擊事件
Button_Get.setClickedListener(this::Get);//給Button_Transform添加單擊事件
Button_Transform.setClickedListener(this::Transform);}privatevoidGet(Componentcomponent){//實例化Locator對象
Locatorlocator=newLocator(getContext());//實例化RequestParam對象,以導(dǎo)航場景為例
RequestParamrequestParam=newRequestParam(RequestParam.SCENE_NAVIGATION);//實例化LocatorCallback對象,向系統(tǒng)提供位置上報的途徑
MyLocatorCallbacklocatorCallback=newMyLocatorCallback();//啟動一次定位
locator.requestOnce(requestParam,locatorCallback);}11.6案例:獲取設(shè)備位置信息及逆地理編碼轉(zhuǎn)化44privatevoidTransform(Componentcomponent){//實例化GeoConvert對象
GeoConvertgeoConvert=newGeoConvert();TaskDispatcherglobalTaskDispatcher=getGlobalTaskDispatcher(TaskPriority.DEFAULT);globalTaskDispatcher.asyncDispatch(newRunnable(){@Overridepublicvoidrun(){try{//坐標(biāo)轉(zhuǎn)化地理位置信息
List<GeoAddress>addressFromLocation=geoConvert.getAddressFromLocation(Latitude,Longitude,1);TaskDispatcheruiTaskDispatcher=getUITaskDispatcher();uiTaskDispatcher.asyncDispatch(newRunnable(){@Overridepublicvoidrun(){HiL(LABEL,"(逆)地理編碼轉(zhuǎn)化成功!");Text_Result.setText("位置:"+addressFromLocation.get(0).getPlaceName());}11.6案例:獲取設(shè)備位置信息及逆地理編碼轉(zhuǎn)化45classMyLocatorCallbackimplementsLocatorCallback{@OverridepublicvoidonLocationReport(Locationlocation){Longitude=location.getLongitude();Latitude=location.getLatitude();TaskDispatcheruiTaskDispatcher=getUITaskDispatcher();uiTaskDispatcher.asyncDispatch(newRunnable(){@Overridepublicvoidrun(){HiL(LABEL,"回調(diào)成功!");Text_Result.setText("經(jīng)度:"+location.getLongitude()+"\n"+"緯度:"+location.getLatitude());}});}11.6案例:獲取設(shè)備位置信息及逆地理編碼轉(zhuǎn)化46@OverridepublicvoidonStatusChanged(inttype){}@OverridepublicvoidonErrorReport(inttype){}}@OverridepublicvoidonActive(){super.onActive();}@OverridepublicvoidonForeground(Intentintent){super.onForeground(intent);}}11.6案例:獲取設(shè)備位置信息及逆地理編碼轉(zhuǎn)化47本案例是在真實設(shè)備(P50Pro)中演示。運(yùn)行程序,點(diǎn)擊“允許獲取設(shè)備位置信息權(quán)限”。運(yùn)行結(jié)果如下圖所示。轉(zhuǎn)化成功11.1傳感器的概念11.4獲取設(shè)備位置信息CONTENTS11.7地圖開發(fā)49使用高德開放平臺支持的HarmonyOS地圖SDK,開發(fā)者可以通過高德開放平臺API和SDK,輕松地完成地圖的構(gòu)建工作,將地圖精致地呈現(xiàn)在應(yīng)用中。下面介紹地圖SDK的使用流程。創(chuàng)建應(yīng)用并配置應(yīng)用的簽名信息。推薦使用DevEcoStudio提供的自動簽名功能。獲取應(yīng)用的appId。配置好應(yīng)用的簽名信息后就可以獲取當(dāng)前應(yīng)用的appId了,這個appId主要用于申請高德的apiKey,請確定最終發(fā)布應(yīng)用的appId,防止最終高德SDK鑒權(quán)失敗。目前只能通過代碼獲取應(yīng)用的appId,示例代碼如下:getApplicationContext().getBundleManager().getBundleInfo(getBundleName(),
0).getAppId()最終獲取的appId格式示例代碼格式如下:com.amap.demo_BGtGgVB3ASqU7ar1nHkwX4s0nIexDbEwqNrVoatUDs17GrClWC7V2/zhoYh6tFQHAd5DXXXXXXAgvZfzrEGljjs=11.7地圖開發(fā)50申請高德APIKey,申請流程可參考官網(wǎng)獲取Key流程。在代碼中設(shè)置申請的Key。請保證在調(diào)用任何高德地圖SDK的接口之前將apikey設(shè)置給高德地圖SDK,建議放到Application的初始化之中。示例代碼如下:/***動態(tài)設(shè)置apiKey。**@paramapiKey在高德官網(wǎng)上申請的apiKey。*/MapsInitializer.setApiKey(StringapiKey)完成以上4步之后,就可以愉快的使用HarmonyOS版高德地圖SDK了。下面開始使用高德開放平臺提供的地圖SDK,首先需要下載SDK資源,在“開發(fā)支持/HarmonyOS地圖SDK/相關(guān)下載”頁面中下載“地圖能力”地圖SDKBeta版。如下圖所示。11.7地圖開發(fā)51在“開發(fā)支持/HarmonyOS地圖SDK/相關(guān)下載”頁面中下載“地圖能力”地圖SDKBeta版。如下圖所示。11.7地圖開發(fā)52使用地圖SDK之前,需要在config.json文件中進(jìn)行相關(guān)權(quán)限設(shè)置,確保地圖功能可以正常使用。申請權(quán)限示例代碼如下:"reqPermissions":[{"usedScene":{"ability":["com.example.harmonysearchsdk.MainAbility"],"when":"always"},"reason":"requestinternet","name":"ohos.permission.INTERNET"}]11.7地圖開發(fā)53接下來向工程中添加下載好的地圖開發(fā)包(“地圖能力”地圖SDK),在“entry/libs”文件中放入下載好的地圖開發(fā)包,并在“entry/build.gradle”文件中添加依賴,示例代碼如下:dependencies{implementationfileTree(dir:'libs',include:['*.jar','*.har'])//...}初始化地圖容器,首先設(shè)置Key,在MyApplition中的示例代碼如下:MapsInitializer.setApiKey("您的key");創(chuàng)建MapView,示例代碼如下:
11.7地圖開發(fā)54publicclassBasicMapDemoSliceextendsAbility{privateMapViewmapView;@OverrideprotectedvoidonStart(Intentintent){super.onStart(intent);initMapView(); AMapaMap=mapView.getMap(); aMap.setOnMapLoadedListener(newAMap.OnMapLoadedListener(){@Override publicvoidonMapLoaded(){//todo } });}11.7地圖開發(fā)55 privatevoidinitMapView(){ mapView=newM
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 河南省某空氣凈化器項目可行性研究報告
- 橋梁包工合同范本
- 2025年度健康醫(yī)療項目承包合同
- 廢舊輪胎資源再生項目可行性研究報告
- 2025年度新能源汽車充電樁安裝工程施工合同
- 汽車產(chǎn)業(yè)園項目可行性研究報告
- 企業(yè)碼頭租賃合同范本
- 2025年度兒童游樂場設(shè)備安全評估與風(fēng)險評估服務(wù)合同
- 2024農(nóng)業(yè)科學(xué)研究與試驗發(fā)展行業(yè)影響因素分析
- 2025年電力設(shè)施改造電費(fèi)補(bǔ)貼合同
- 瑜伽課程合同轉(zhuǎn)讓協(xié)議書范本
- 個人經(jīng)營性貸款合同模板
- 人教版英語2025七年級下冊 Unit1Animal Friends教師版 語法講解+練習(xí)
- DeepSeek新手入門教程
- 課件:《教育強(qiáng)國建設(shè)規(guī)劃綱要(2024-2035年)》學(xué)習(xí)宣講
- 2025年山東化工職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試近5年??及鎱⒖碱}庫含答案解析
- 2025年全國幼兒園教師資格證考試教育理論知識押題試題庫及答案(共九套)
- 2024年鄭州電力高等??茖W(xué)校高職單招職業(yè)適應(yīng)性測試歷年參考題庫含答案解析
- 產(chǎn)品試產(chǎn)流程
- 舞臺機(jī)械基礎(chǔ)知識培訓(xùn)
- 人教版數(shù)學(xué)八年級下冊 第16章 二次根式 單元測試(含答案)
評論
0/150
提交評論