鴻蒙應用程序開發(fā) 課件 第10-12章 分布式任務調度、設備管理、網(wǎng)絡與連接_第1頁
鴻蒙應用程序開發(fā) 課件 第10-12章 分布式任務調度、設備管理、網(wǎng)絡與連接_第2頁
鴻蒙應用程序開發(fā) 課件 第10-12章 分布式任務調度、設備管理、網(wǎng)絡與連接_第3頁
鴻蒙應用程序開發(fā) 課件 第10-12章 分布式任務調度、設備管理、網(wǎng)絡與連接_第4頁
鴻蒙應用程序開發(fā) 課件 第10-12章 分布式任務調度、設備管理、網(wǎng)絡與連接_第5頁
已閱讀5頁,還剩147頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第10章分布式任務調度引言本章學習目標了解HarmonyOS分布式任務調度的概念熟練使用HarmonyOS實現(xiàn)分布式任務調度過程2第10章分布式任務調度10.1分布式任務調度概述10.2分布式任務調度能力簡介10.3分布式任務調度實現(xiàn)原理310.4實現(xiàn)分布式任務調度10.5案例:分布式任務調度FA10.1分布式任務調度概述4分布式任務調度的核心價值有三個,分別是“超級虛擬終端”的能力互助、跨設備軟件訪問的系統(tǒng)服務、全場景下的任務調度。O1O2O3“超級虛擬終端”的能力互助在HarmonyOS中,分布式任務調度平臺是支持“超級虛擬終端”的關鍵技術和能力,提供針對多設備場景下的統(tǒng)一的組件管理能力。分布式任務調度平臺助力“超級虛擬終端”實現(xiàn)軟件和硬件兩方面的能力的互助。跨設備軟件訪問的系統(tǒng)服務為了降低開發(fā)者開發(fā)跨設備應用的難度,分布式任務調度平臺提供了跨設備軟件訪問的系統(tǒng)服務。借助分布式任務調度平臺,開發(fā)者在調用跨設備的服務時,實際上跟調用本地服務基本上沒有差別。全場景下的任務調度分布式任務調度無論是在HarmonyOS的富設備上,還是在HarmonyOS的輕設備上,都是支持的。除此之外,通過HarmonyOS分布式中間件還能夠支持其他OS的任務調度。第10章分布式任務調度10.1分布式任務調度概述10.2分布式任務調度能力簡介10.3分布式任務調度實現(xiàn)原理510.4實現(xiàn)分布式任務調度10.5案例:分布式任務調度FA10.2分布式任務調度能力簡介6分布式任務調度平臺在HarmonyOS底層實現(xiàn)Ability跨設備的組件管理、控制和訪問。截至目前,分布式任務調度平臺已經(jīng)開放的功能包括:全局查詢:支持查詢在相同組網(wǎng)下到底有哪些設備,這些設備是在線的還是離線的,等等。啟動和關閉:向開發(fā)者提供管理遠程Ability的能力,即支持啟動Page模板的Ability,以及啟動、關閉Service和Data模板的Ability。連接和斷開連接:向開發(fā)者提供跨設備控制服務(Service和Data模板的Abiy)的能力,開發(fā)者可以通過與遠程服務連接及斷開連接實現(xiàn)獲取或注銷跨設備管理服務的對象,達到和本地一致的服務調度。遷移能力:向開發(fā)者提供跨設備業(yè)務的無縫遷移能力,開發(fā)者可以通過調用Page模板Ability的遷移接口將本地業(yè)務無縫遷移到指定設備中,打通設備間的壁壘。輕量通信:可以通過遠程對象的方式來實現(xiàn)設備之間的輕量通信。10.2分布式任務調度能力簡介7下面分別介紹HarmonyOS分布式任務調度平臺提供的四種功能:全局查詢?nèi)植樵兛梢苑譃閮蓚€維度:針對設備的查詢以及針對Ability的查詢。啟動和關閉跟PC不同,移動終端的一個短板在于其硬件資源和電池存在一定瓶頸,這決定了在為移動終端設計Ability時,這些Ability需要按需啟動或者關閉。分布式任務調度平臺提供了管理遠程Ability的能力,即支持啟動Page模板的Ability,以及啟動、關閉Service和Data模板的Ability。連接和斷開連接在連接到遠程設備之后,就可以對設備進行一些列的操作了。操作完成之后,也可以斷開連接。輕量通信輕量通信本質是指從RPC(RemoteProcedureCall,遠程過程調用)或者以消息的方式實現(xiàn)設備之間的通信。這使得設備在調用其他方法時跟調用本地方法類似。第10章分布式任務調度10.1分布式任務調度概述10.2分布式任務調度能力簡介10.3分布式任務調度實現(xiàn)原理810.4實現(xiàn)分布式任務調度10.5案例:分布式任務調度FA10.3分布式任務調度實現(xiàn)原理9分布式任務調度實現(xiàn)原理最為核心的問題是設備之間的通信問題。PRC主要涉及三方面,即接口定義、序列化和反序列化。要實現(xiàn)PRC,必須要實現(xiàn)Iremotebroker接口。同時,需要在本地及對端分別實現(xiàn)對外接口一致的代理。HarmonyOS設備之間的通信無論是調用本地設備還是遠程設備的Ability,HarmonyOS都是通過Remoteobject來實現(xiàn)的。當初次調用遠程設備時,會先通過分布式調度平臺獲取到遠程設備的一個句柄。在后續(xù)的通信過程中本地設備就可以不必再依賴分布式調度平臺而直接通過句柄去跟遠程設備進行通信,從而提升通信效率。HarmonyOS設備與其他OS設備之間的通信與HarmonyOS設備之間的通信不同,HarmonyOS設備與其他OS設備之間無法直接通過句柄去調用,因此分布式調度平臺充當了HarmonyOS設備與其他OS設備之間的代理。所有的通信必須經(jīng)過分布式調度平臺,分布式調度平臺會做調用過程中的序列化和反序列化。因此,從通信效率而言HarmonyOS設備與其他OS設備之間的通信效率肯定要低于HarmonyOS設備之間的通信。第10章分布式任務調度10.1分布式任務調度概述10.2分布式任務調度能力簡介10.3分布式任務調度實現(xiàn)原理1010.4實現(xiàn)分布式任務調度10.5案例:分布式任務調度FA10.4.1

如何實現(xiàn)分布式任務調度11要實現(xiàn)分布式任務調度,開發(fā)者需要在應用中做如下操作:在Intent中設置支持分布式的標記(例如Intent.FLAG_ABILITYSLICE_MULTI_DEVICE表示該應用支持分布式調度),否則將無法獲得分布式能力。在config.json中的reqPermissions字段中添加多設備協(xié)同訪問的權限申請:"name":"ohos.permission.DISTRIBUTED_DATASYNC"。PA的調用支持連接及斷開連接、啟動及關閉這4類行為,在進行調度時:必須在Intent中指定PA對應的BundleName和AbilityName。FA的調用支持啟動和遷移行為,在進行調度時:當啟動FA時,需要開發(fā)者在Intent中指定遠端設備的DeviceId、BundleName和AbilityName。FA的遷移實現(xiàn)相同BundleName和AbilityName的FA跨設備遷移時,需要指定遷移設備的DeviceId。10.4.2分布式任務調度支持的場景12根據(jù)Ability模板及意圖的不同,分布式任務調度向開發(fā)者提供了6種能力:啟動遠程FA(PageAbility)、啟動遠程PA(ServiceAbility、DataAbility)、關閉遠程PA、連接遠程PA、斷開連接遠程PA和FA跨設備遷移。下面以設備A(本地設備)和設備B(遠端設備)為例進行場景介紹:設備A啟動設備B的FA:在設備A上通過本地應用提供的啟動按鈕啟動設備B上對應的FA。例如,設備A控制設備B打開相冊,只需開發(fā)者在啟動FA時指定打開相冊的意圖即可。設備A啟動設備B的PA:在設備A上通過本地應用提供的啟動按鈕啟動設備B上指定的PA。例如,開發(fā)者在啟動遠程服務時通過意圖指定音樂播放服務,即可實現(xiàn)設備A啟動設備B音樂播放的能力。設備A關閉設備B的PA:在設備A上通過本地應用提供的關閉按鈕關閉設備B上指定的PA。類似啟動的過程,開發(fā)者在關閉遠程服務時通過意圖指定音樂播放服務,即可實現(xiàn)關閉設備B上該服務的能力。設備A連接設備B的PA:在設備A上通過本地應用提供的連接按鈕連接設備B上指定的PA。連接后,通過其他功能相關按鈕實現(xiàn)控制對端PA的能力。通過連接關系,開發(fā)者可以實現(xiàn)跨設備的同步服務調度,實現(xiàn)如大型計算任務互助等價值場景。設備A與設備B的PA斷開連接:在設備A上通過本地應用提供的斷開連接的按鈕將之前已連接的PA斷開連接。設備A的FA遷移至設備B:設備A上通過本地應用提供的遷移按鈕將設備A的業(yè)務無縫遷移到設備B中。通過業(yè)務遷移能力打通設備A和設備B間的壁壘,實現(xiàn)如文檔跨設備編輯、視頻從客廳到房間跨設備接續(xù)播放等場景。第10章分布式任務調度10.1分布式任務調度概述10.2分布式任務調度能力簡介10.3分布式任務調度實現(xiàn)原理1310.4實現(xiàn)分布式任務調度10.5案例:分布式任務調度FA10.5案例:分布式任務調度FA14創(chuàng)建一個名為DistributedTaskSchedulingFA的應用來演示分布式任務調度FA實現(xiàn)的過程。應用頁面中需要添加下面這些組件:文本輸入組件:用于獲取文本內(nèi)容。打開遠端頁面按鈕組件:用于啟動遠端設備指定的FA。遷移按鈕組件:用于將本地設備的Ability遷移至遠端設備?;剡w按鈕組件:用于將遠端設備的Ability遷移至本地設備。修改ability_main.xml文件,其內(nèi)容如下:<?xmlversion="1.0"encoding="utf-8"?><DirectionalLayoutxmlns:ohos="/res/ohos"ohos:height="match_parent"ohos:width="match_parent"ohos:alignment="top"ohos:orientation="vertical">10.5案例:分布式任務調度FA15<Textohos:height="match_content"ohos:width="match_content"ohos:background_element="$graphic:background_ability_main"ohos:layout_alignment="horizontal_center"ohos:text="分布式任務調度案例"ohos:text_size="28fp"ohos:top_margin="10vp"/><TextFieldohos:id="$+id:TextField_Input"ohos:height="300vp"ohos:width="340vp"ohos:background_element="#DEDEDE"ohos:hint="請輸入:"ohos:layout_alignment="horizontal_center"ohos:margin="10vp"ohos:max_text_lines="5"ohos:multiple_lines="true"ohos:text_alignment="left"ohos:text_size="28fp"/>10.5案例:分布式任務調度FA16<Buttonohos:id="$+id:Btn_Open"ohos:height="match_content"ohos:width="match_parent"ohos:background_element="$graphic:background_ability_main_Button"ohos:layout_alignment="horizontal_center"ohos:margin="10vp"ohos:padding="5vp"ohos:text="打開遠端頁面"ohos:text_size="28fp"/><Buttonohos:id="$+id:Btn_Move"ohos:height="match_content"ohos:width="match_parent"ohos:background_element="$graphic:background_ability_main_Button"ohos:layout_alignment="horizontal_center"ohos:margin="10vp"ohos:padding="5vp"ohos:text="遷移"ohos:text_size="28fp"/>10.5案例:分布式任務調度FA17<Buttonohos:id="$+id:Btn_moveBack"ohos:height="match_content"ohos:width="match_parent"ohos:background_element="$graphic:background_ability_main_Button"ohos:layout_alignment="horizontal_center"ohos:margin="10vp"ohos:padding="5vp"ohos:text="回遷"ohos:text_size="28fp"/></DirectionalLayout>10.5案例:分布式任務調度FA18<?xmlversion="1.0"encoding="UTF-8"?><shapexmlns:ohos="/res/ohos"ohos:shape="rectangle"><solidohos:color="#0aabbc"/><cornersohos:radius="50vp"/></shape>Button組件引用了background_ability_main_Button文件,其內(nèi)容如下:10.5案例:分布式任務調度FA19"reqPermissions":[ { "name":"ohos.permission.GET_BUNDLE_INFO" }, { "name":"ohos.permission.DISTRIBUTED_DATASYNC" }, { "name":"ohos.permission.GET_DISTRIBUTED_DEVICE_INFO" }, { "name":"ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE" }]進行分布式任務調度需要分布式數(shù)據(jù)同步權限,在config.json文件中需要請求,其內(nèi)容如下:上述代碼中,各個權限含義如下:ohos.permission.GET_BUNDLE_INFO:允許非系統(tǒng)應用程序查詢其他應用程序的信息。ohos.permission.DISTRIBUTED_DATASYNC:允許應用程序與另一個設備交換用戶數(shù)據(jù)ohos.permission.GET_DISTRIBUTED_DEVICE_INFO:獲取其他設備信息。ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE:獲取其他設備狀態(tài)。10.5案例:分布式任務調度FA20publicclassMainAbilityextendsAbilityimplementsIAbilityContinuation{privatestaticfinalintMY_PERMISSIONS_DISTRIBUTED_DATASYNC=1;@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setMainRoute(MainAbilitySlice.class.getName());if(verifySelfPermission("ohos.permission.DISTRIBUTED_DATASYNC")!=IBundleManager.PERMISSION_GRANTED){//應用未被授予權限

if(canRequestPermission("ohos.permission.DISTRIBUTED_DATASYNC")){//是否可以申請彈框授權(首次申請或者用戶未選擇禁止且不再提示)requestPermissionsFromUser(newString[]{"ohos.permission.DISTRIBUTED_DATASYNC"},MY_PERMISSIONS_DISTRIBUTED_DATASYNC);}else{//顯示應用需要權限的理由,提示用戶進入設置授權

}}else{//權限已被授予

}}修改MainAbility,內(nèi)容如下:10.5案例:分布式任務調度FA21@OverridepublicvoidonRequestPermissionsFromUserResult(intrequestCode,String[]permissions,int[]grantResults){switch(requestCode){caseMY_PERMISSIONS_DISTRIBUTED_DATASYNC:{//匹配requestPermissions的requestCodeif(grantResults.length>0&&grantResults[0]==IBundleManager.PERMISSION_GRANTED){//權限被授予

//注意:因時間差導致接口權限檢查時有無權限

//所以對那些因無權限而拋異常的接口進行異常捕獲處理

}else{//權限被拒絕

}return;}}}10.5案例:分布式任務調度FA22@OverridepublicbooleanonStartContinuation(){returntrue;}@OverridepublicbooleanonSaveData(IntentParamsintentParams){returntrue;}@OverridepublicbooleanonRestoreData(IntentParamsintentParams){returntrue;}@OverridepublicvoidonCompleteContinuation(inti){}10.5案例:分布式任務調度FA23publicclassMainAbilitySliceextendsAbilitySliceimplementsIAbilityContinuation{//文本輸入框

privateTextFieldTextField_Input;//需要恢復的數(shù)據(jù)

StringReply;@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);//找到組件

TextField_Input=findComponentById(ResourceTable.Id_TextField_Input);//將恢復的數(shù)據(jù)顯示在頁面上

TextField_Input.setText(Reply);ButtonBtn_Open=findComponentById(ResourceTable.Id_Btn_Open);ButtonBtn_Move=findComponentById(ResourceTable.Id_Btn_Move);ButtonBtn_moveBack=findComponentById(ResourceTable.Id_Btn_moveBack);//給Btn_Open添加單擊事件,打開目標設備的目標PageBtn_Open.setClickedListener(component->{//獲取在線設備列表

List<DeviceInfo>deviceInfoList=修改MainAbilitySlice,其內(nèi)容如下:10.5案例:分布式任務調度FA24DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);//如果設備列表為空,則返回

if(deviceInfoList.isEmpty()){return;}//獲取設備Id,這里是另一臺設備

StringdeviceId=deviceInfoList.get(0).getDeviceId();//創(chuàng)建Intent對象

Intentintent1=newIntent();//創(chuàng)建Operation對象

Operationoperation=newIntent.OperationBuilder()//設置目標設備

.withDeviceId(deviceId)//設置目標包名

.withBundleName(getBundleName())//設置目標Page名

.withAbilityName(MainAbility.class.getName())//設置分布式能力標簽

.withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE).build();intent1.setOperation(operation);//啟動目標AbilitystartAbility(intent1);});10.5案例:分布式任務調度FA25 //給Btn_Move添加單擊事件,請求遷移

Btn_Move.setClickedListener(component->{//獲取在線設備列表

List<DeviceInfo>deviceInfoList=DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);//如果設備列表為空,則返回

if(deviceInfoList.isEmpty()){return;}//獲取設備Id,這里是另一臺設備

StringdeviceId=deviceInfoList.get(0).getDeviceId();//只請求遷移

//continueAbility(deviceId);//請求遷移并可回遷

continueAbilityReversibly(deviceId);});//給Btn_moveBack添加單擊事件,請求回遷

Btn_moveBack.setClickedListener(component->{reverseContinueAbility();});}10.5案例:分布式任務調度FA26@OverridepublicvoidonActive(){super.onActive();}@OverridepublicvoidonForeground(Intentintent){super.onForeground(intent);}@OverridepublicbooleanonStartContinuation(){returntrue;}@OverridepublicbooleanonSaveData(IntentParamsintentParams){//需要保存的數(shù)據(jù)

intentParams.setParam("data",TextField_Input.getText());returntrue;}10.5案例:分布式任務調度FA27@OverridepublicbooleanonRestoreData(IntentParamsintentParams){//需要恢復的數(shù)據(jù)

Reply=intentParams.getParam("data").toString();returntrue;}@OverridepublicvoidonCompleteContinuation(inti){}}在跨設備遷移FA時MainAbilitySlice也需要實現(xiàn)IAbilityContinuation接口,并重寫其中各個方法。上述代碼中定義了文本輸入組件,分別給打開遠端頁面按鈕組件,遷移與回遷按鈕組件添加了單擊事件。觀察拉起遠端頁面按鈕組件的單擊事件,可知其是通過Intent打開遠端設備的Ability。10.5案例:分布式任務調度FA28打開遠程模擬器中的“雙P40模擬器”,以SupperApp模式將程序運行在兩臺設備上。結果如圖所示。ThankYou第11章設備管理引言本章學習目標了解HarmonyOS傳感器基本概念和架構熟悉HarmonyOS傳感器的開發(fā)步驟31掌握獲取設備位置信息及地理編碼轉化的實現(xiàn)11.1傳感器的概念11.2傳感器開發(fā)步驟11.3位置開發(fā)概述11.4獲取設備位置信息11.5地理編碼轉化11.6案例11.7地圖開發(fā)CONTENTS11.1.1傳感器架構33HarmonyOS傳感器包含4個模塊:SensorAPI、SensorFramework、SensorService和HD-IDL層。HarmonyOS傳感器的架構圖如圖所示。11.1.1傳感器架構34傳感器架構分為以下幾層:SensorAPI:提供傳感器的基礎API,主要包含查詢傳感器的列表、訂閱/取消傳感器的數(shù)據(jù)、執(zhí)行控制命令等,簡化應用開發(fā)。SensorFramework:主要實現(xiàn)傳感器的訂閱管理,數(shù)據(jù)通道的創(chuàng)建、銷毀、訂閱與取消訂閱,實現(xiàn)與SensorService的通信。SensorService:主要實現(xiàn)HD_IDL層數(shù)據(jù)接收、解析、分發(fā),前后臺的策略管控,對該設備Sensor的管理,Sensor權限管控等。HD-IDL層:對不同的FIFO、頻率進行策略選擇,以及對不同設備的適配。11.1.1傳感器架構35各種傳感器可實現(xiàn)功能:通過方向傳感器數(shù)據(jù),可以感知用戶設備當前的朝向,從而達到為用戶指明方位的目的。通過重力和陀螺儀傳感器數(shù)據(jù),能感知設備傾斜和旋轉量,提高用戶在游戲場景中的體驗。通過接近光傳感器數(shù)據(jù),感知距離遮擋物的距離,使設備能夠自動亮滅屏,達到防誤觸目的。通過氣壓計傳感器數(shù)據(jù),可以準確的判斷設備當前所處的海拔。通過環(huán)境光傳感器數(shù)據(jù),設備能夠實現(xiàn)背光自動調節(jié)。通過霍爾傳感器數(shù)據(jù),設備可以實現(xiàn)皮套功能等。11.1.1傳感器架構36約束與限制:

針對某些傳感器,開發(fā)者需要請求相應的權限,才能獲取相應傳感器的數(shù)據(jù)。表展示的是傳感器權限。重點提示:傳感器數(shù)據(jù)訂閱和取消訂閱接口成對調用,當不再需要訂閱傳感器數(shù)據(jù)時,開發(fā)者需要調用取消訂閱接口進行資源釋放。傳感器權限名敏感級別權限描述加速度傳感器、加速度未校準傳感器、線性加速度傳感器ohos.permission.ACCELEROMETERsystem_grant允許訂閱Motion組對應的加速度傳感器的數(shù)據(jù)陀螺儀傳感器、陀螺儀未校準傳感器ohos.permission.GYROSCOPEsystem_grant允許訂閱Motion組對應的陀螺儀傳感器的數(shù)據(jù)計步器ohos.permission.ACTIVITY_MOTIONuser_grant允許訂閱運動狀態(tài)心率ohos.permission.READ_HEALTH_DATAuser_grant允許讀取健康數(shù)據(jù)11.1.2開發(fā)傳感器時用到的接口37HarmonyOS傳感器提供的功能有:查詢傳感器的列表、訂閱/取消訂閱傳感器數(shù)據(jù)、查詢傳感器的最小采樣時間間隔、執(zhí)行控制命令。以訂閱方向類別的傳感器數(shù)據(jù)為例,本節(jié)示例涉及的接口如表所示。CategoryOrientationAgent的主要接口接口名描述getAllSensors()獲取屬于方向類別的傳感器列表。getAllSensors(int)獲取屬于方向類別中特定類型的傳感器列表。getSingleSensor(int)查詢方向類別中特定類型的默認sensor(如果存在多個則返回第一個)。setSensorDataCallback(ICategoryOrientationDataCallback,CategoryOrientation,long)以設定的采樣間隔訂閱給定傳感器的數(shù)據(jù)。setSensorDataCallback(ICategoryOrientationDataCallback,CategoryOrientation,long,long)以設定的采樣間隔和時延訂閱給定傳感器的數(shù)據(jù)。releaseSensorDataCallback(ICategoryOrientationDataCallback,CategoryOrientation)取消訂閱指定傳感器的數(shù)據(jù)。releaseSensorDataCallback(ICategoryOrientationDataCallback)取消訂閱的所有傳感器數(shù)據(jù)。11.1.2開發(fā)傳感器時用到的接口38SensorAgent的主要接口CategoryOrientationData的主要接口接口名描述getSensorMinSampleInterval(int)查詢給定傳感器的最小采樣間隔。runCommand(int,int,int)針對某個傳感器執(zhí)行命令,刷新傳感器的數(shù)據(jù)。接口名描述getDeviceRotationMatrix(float[],float[])根據(jù)旋轉矢量獲取旋轉矩陣。getDeviceOrientation(float[],float[])根據(jù)旋轉矩陣獲取設備的方向。11.1傳感器的概念11.2傳感器開發(fā)步驟11.3位置開發(fā)概述11.4獲取設備位置信息11.5地理編碼轉化11.6案例11.7地圖開發(fā)CONTENTS11.2傳感器開發(fā)步驟40傳感器的分類傳感器有運動類傳感器、環(huán)境類傳感器、方向類傳感器、光線類傳感器、健康類傳感器、其他類傳感器,這里舉一些常見的傳感器以及其對應的代碼:運動類:SENSOR_TYPE_ACCELEROMETER:加速度傳感器,測量三個物理軸(x、y和z)上,施加在設備上的加速度(包括重力加速度),單位:m/s2,可檢測運動狀態(tài)。SENSOR_TYPE_LINEAR_ACCELERATION:線性加速度傳感器,作用同上,可檢測每個單軸方向上的線性加速度。SENSOR_TYPE_PEDOMETER_DETECTION:計步器檢測傳感器,檢測用戶的計步動作;如果取值為1則代表用戶產(chǎn)生了計步行走的動作;取值為0則代表用戶沒有發(fā)生運動,可用于檢測用戶是否有計步的動作。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:方向傳感器,測量設備圍繞所有三個物理軸(x、y、z)旋轉的角度值,單位:rad,可用于提供屏幕旋轉的3個角度值。健康類:SENSOR_TYPE_HEART_RATE:心率傳感器,測量用戶的心率數(shù)值,可用于提供用戶的心率健康數(shù)據(jù)。11.2傳感器開發(fā)步驟41如果讀者需要HarmonyOS支持的所有傳感器列表,可查詢開發(fā)者聯(lián)盟官網(wǎng)指南。有些傳感器的使用需要權限,如果設備上使用了傳感器權限列表中的傳感器,需要請求相應的權限,開發(fā)者才能獲取到傳感器數(shù)據(jù)。不同敏感級別的傳感器舉例如下表所示。敏感級別傳感器權限名權限描述system_grant加速度傳感器、加速度未校準傳感器、線性加速度傳感器ohos.permission.ACCELEROMETER允許訂閱Motion組對應的加速度傳感器的數(shù)據(jù)。user_grant計步器ohos.permission.ACTIVITY_MOTION允許訂閱運動狀態(tài)。11.2傳感器開發(fā)步驟42權限配置開發(fā)者需要在config.json里面配置權限:開發(fā)者如果需要獲取加速度的數(shù)據(jù),需要進行如下權限配置。"reqPermissions":[{"name":"ohos.permission.ACCELEROMETER","reason":"","usedScene":{"ability":[".MainAbility"],"when":"inuse"}}]11.2傳感器開發(fā)步驟43對于需要用戶授權的權限,如計步器傳感器,需要進行如下權限配置。"reqPermissions":[{"name":"ohos.permission.ACTIVITY_MOTION","reason":"","usedScene":{"ability":[".MainAbility"],"when":"inuse"}}]11.2傳感器開發(fā)步驟44由于敏感權限需要用戶授權,因此,開發(fā)者在應用啟動時或者調用訂閱數(shù)據(jù)接口前,需要調用權限檢查和請求權限接口。@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ā)步驟45@OverridepublicvoidonRequestPermissionsFromUserResult(intrequestCode,String[]permissions,int[]grantResults){//匹配requestPermissionsFromUser的requestCodeif(requestCode==1){if(grantResults.length>0&&grantResults[0]==0){//權限被授予

}else{//權限被拒絕

}}}11.2傳感器開發(fā)步驟46傳感器的使用以使用方向類、運動類的傳感器為例,環(huán)境類、健康類等類別的傳感器使用方法與其類似。獲取待訂閱數(shù)據(jù)的傳感器。創(chuàng)建傳感器回調。訂閱傳感器數(shù)據(jù)。接收并處理傳感器數(shù)據(jù)。取消訂閱傳感器數(shù)據(jù)。下面介紹計步器傳感器和方向傳感器的開發(fā)過程。創(chuàng)建一個名為SensorDemo的應用,創(chuàng)建兩個Page:PedometerAbility、DirectionAbility分別對應運動類計步器傳感器和方向類方向傳感器的開發(fā)使用。計步器傳感器頁面有兩個Butotn組件和一個Text組件,分別是用來訂閱/取消訂閱傳感器數(shù)據(jù)和將獲取的“步數(shù)”數(shù)據(jù)顯示出來。方向類方向傳感器頁面與之類似,只不過Text組件的作用是將獲取的“方向”數(shù)據(jù)顯示出來,這里對XML文件中的內(nèi)容不再贅述。11.2.1案例:計步器傳感器47本小節(jié)介紹計步器傳感器的開發(fā)過程,創(chuàng)建一個名為PedometerSensorDemo的應用來演示。因為計步器傳感器的使用需要請求“允許訂閱運動狀態(tài)”權限才可以獲取相應的傳感器數(shù)據(jù),且該權限為敏感權限,所以還需要進行動態(tài)申請,config.json文件中請求權限部分代碼如下:"reqPermissions":[{"name":"ohos.permission.ACTIVITY_MOTION"}]在MainAbility文件中的onStart()方法里進行動態(tài)申請,其內(nèi)容如下:11.2.1案例:計步器傳感器48publicclassMainAbilityextendsAbility{@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){//權限被授予

}else{//權限被拒絕

}}}}11.2.1案例:計步器傳感器49修改MainAbilitySlice,其內(nèi)容如下:publicclassMainAbilitySliceextendsAbilitySlice{//定義日志標簽

staticfinalHiLogLabelLABEL=newHiLogLabel(HiLog.LOG_APP,0x00922,"MainAbilitySlice");//運動類傳感器代理對象

privateCategoryMotionAgentcategoryMotionAgent;//運動類傳感器對象

privateCategoryMotioncategoryMotion;privateTextText_Result;privateintStep=0;@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);//初始化組件

InitComponent();}11.2.1案例:計步器傳感器50//初始化組件

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案例:計步器傳感器51//取消訂閱傳感器數(shù)據(jù)

privatevoidStop(Componentcomponent){//取消訂閱計步器檢測傳感器

categoryMotionAgent.releaseSensorDataCallback(iCategoryMotionDataCallback,categoryMotion);}//運動類傳感器數(shù)據(jù)回調

privatefinalICategoryMotionDataCallbackiCategoryMotionDataCallback=newICategoryMotionDataCallback(){@OverridepublicvoidonSensorDataModified(CategoryMotionDatacategoryMotionData){HiL(LABEL,"onSensorDataModified()方法被調用");Step++;getUITaskDispatcher().asyncDispatch(()->{Text_Result.setText(Step+"");});}

11.2.1案例:計步器傳感器52 @OverridepublicvoidonAccuracyDataModified(CategoryMotioncategoryMotion,inti){}@OverridepublicvoidonCommandCompleted(CategoryMotioncategoryMotion){}}; @Override publicvoidonActive(){super.onActive(); } @Override publicvoidonForeground(Intentintent){super.onForeground(intent);}}11.2.1案例:計步器傳感器53上述代碼中:在訂閱傳感器數(shù)據(jù)按鈕的單擊事件中,首先獲取了運動類傳感器代理對象categoryMotionAgent,接著通過getSingleSensor()方法得到計步器傳感器對象categoryMotion,最后通過setSensorDataCallback()回調訂閱計步器傳感器,其三個參數(shù)分別是:傳感器數(shù)據(jù)回調對象、運動類傳感器對象、采樣頻率模式。采樣頻率模式有四種分別是:SENSOR_SAMPLING_RATE_FASTEST:表示獲取傳感器數(shù)據(jù)的最快采樣速率。SENSOR_SAMPLING_RATE_GAME:表示在游戲場景中獲取傳感器數(shù)據(jù)的采樣率。SENSOR_SAMPLING_RATE_NORMAL:指示獲取傳感器數(shù)據(jù)的默認采樣率,例如在屏幕旋轉的情況下。SENSOR_SAMPLING_RATE_UI:指示在UI上獲取傳感器數(shù)據(jù)的采樣率。onAccuracyDataModified()方法是當數(shù)據(jù)精度發(fā)生變化時進行回調。onCommandCompleted()方法是當傳感器命令執(zhí)行完成時回調。11.2.1案例:計步器傳感器54運行程序,點擊“允許應用訪問您的健身運動”權限,單擊“訂閱傳感器數(shù)據(jù)”按鈕,記錄結果如圖所示11.2.2案例:方向傳感器55本小節(jié)介紹方向傳感器的開發(fā)過程,創(chuàng)建一個名為DirectionSensorDemo的應用來演示。方向傳感器的使用不需要申請權限。修改MainAbilitySlice,詳細代碼參考11.2.2節(jié)內(nèi)容。運行程序,應用初始頁面如圖所示。11.1傳感器的概念11.4獲取設備位置信息11.5地理編碼轉化11.6案例11.7地圖開發(fā)CONTENTS11.3位置開發(fā)概述57移動設備已深入人們?nèi)粘I畹母鱾€方面,如天氣、新聞、出行、導航和運動記錄。系統(tǒng)的位置能力能提供實時的位置信息,為開發(fā)者設計基于位置的服務提供可能性,提升用戶體驗。通過GNSS、基站、WLAN/藍牙等多種技術,設備在室內(nèi)外均可準確定位。1.基本概念坐標:系統(tǒng)以1984年世界大地坐標系統(tǒng)為參考,使用經(jīng)度、緯度數(shù)據(jù)描述地球上的一個位置。GNSS定位:基于全球導航衛(wèi)星系統(tǒng),包含:GPS、GLONASS、北斗、Galileo等,通過導航衛(wèi)星、設備芯片提供的定位算法,來確定設備準確位置。定位過程具體使用哪些定位系統(tǒng),取決于用戶設備的硬件能力?;径ㄎ唬焊鶕?jù)設備當前駐網(wǎng)基站和相鄰基站的位置,估算設備當前位置。此定位方式的定位結果精度相對較低,并且需要設備可以訪問蜂窩網(wǎng)絡。WLAN、藍牙定位:根據(jù)設備可搜索到的周圍WLAN、藍牙設備位置,估算設備當前位置。此定位方式的定位結果精度依賴設備周圍可見的固定WLAN、藍牙設備的分布,密度較高時,精度也相較于基站定位方式更高,同時也需要設備可以訪問網(wǎng)絡。11.3位置開發(fā)概述582.運作機制坐標:位置能力作為系統(tǒng)為應用提供的一種基礎服務,需要應用在所使用的業(yè)務場景,向系統(tǒng)主動發(fā)起請求,并在業(yè)務場景結束時,主動結束此請求,在此過程中系統(tǒng)會將實時的定位結果上報給應用。3.約束與限制使用設備的位置能力,需要用戶進行確認并主動開啟位置開關。如果位置開關沒有開啟,系統(tǒng)不會向任何應用提供位置服務。設備位置信息屬于用戶敏感數(shù)據(jù),所以即使用戶已經(jīng)開啟位置開關,應用在獲取設備位置前仍需向用戶申請位置訪問權限。在用戶確認允許后,系統(tǒng)才會向應用提供位置服務。開發(fā)者可以調用HarmonyOS位置相關接口,獲取設備實時位置,或者最近的歷史位置。對于位置敏感的應用業(yè)務,建議獲取設備實時位置信息。如果不需要設備實時位置信息,并且希望盡可能的節(jié)省耗電,開發(fā)者可以考慮獲取最近的歷史位置11.1傳感器的概念11.4獲取設備位置信息11.5地理編碼轉化11.6案例11.7地圖開發(fā)CONTENTS11.4獲取設備位置信息60應用在使用系統(tǒng)能力前,需要檢查是否已經(jīng)獲取用戶授權訪問設備位置信息。如未獲得授權,可以向用戶申請需要的位置權限。系統(tǒng)提供的定位權限有:ohos.permission.LOCATIONohos.permission.LOCATION_IN_BACKGROUND訪問設備的位置信息,必須申請ohos.permission.LOCATION權限,并且獲得用戶授權。如果應用在后臺運行時也需要訪問設備位置,除需要將應用聲明為允許后臺運行外,還必須申請ohos.permission.LOCATION_IN_BACKGROUND權限,這樣應用在切入后臺之后,系統(tǒng)可以繼續(xù)上報位置信息。11.4獲取設備位置信息61下面以獲取設備的位置信息為例介紹具體開發(fā)過程開發(fā)者可以在應用config.json文件中聲明所需要的權限,示例代碼如下:{"module":{"reqPermissions":[{"name":"ohos.permission.LOCATION","reason":"$string:reason_description","usedScene":{"ability":["com.myapplication.LocationAbility"],"when":"inuse"},{...}]}}11.4獲取設備位置信息62實例化Locator對象,所有與基礎定位能力相關的功能API,都是通過Locator提供的。Locatorlocator=newLocator(context);實例化RequestParam對象,用于告知系統(tǒng)該向應用提供何種類型的位置服務,以及位置結果上報的頻率。實例化LocatorCallback對象,用于向系統(tǒng)提供位置上報的途徑。示例代碼如下:MyLocatorCallbacklocatorCallback=newMyLocatorCallback();

publicclassMyLocatorCallbackimplementsLocatorCallback{

@Override publicvoidonLocationReport(Locationlocation){ }

@Override publicvoidonStatusChanged(inttype){ }

@Override publicvoidonErrorReport(inttype){ }}11.4獲取設備位置信息63啟動定位locator.startLocating(requestParam,locatorCallback);結束定位(可選)如果應用不需要持續(xù)獲取位置結果,可以使用如下方式啟動定位,系統(tǒng)會上報一次實時定位結果后,自動結束應用的定位請求。應用不需要執(zhí)行結束定位。locator.requestOnce(requestParam,locatorCallback);locator.stopLocating(locatorCallback);如果應用使用場景不需要實時的設備位置,可以獲取系統(tǒng)緩存的最近一次歷史定位結果。locator.getCachedLocation();此接口的使用需要應用向用戶申請ohos.permission.LOCATION權限。11.1傳感器的概念11.4獲取設備位置信息11.6案例11.7地圖開發(fā)CONTENTS11.5地理編碼轉化65系統(tǒng)向開發(fā)者提供了地理編碼轉化能力(將地理描述轉化為具體坐標),以及逆地理編碼轉化能力(將坐標轉化為地理描述)。其中地理編碼包含多個屬性來描述位置,包括國家、行政區(qū)劃、街道、門牌號、地址描述等等,這樣的信息更便于用戶理解。進行坐標和地理編碼信息的相互轉化,所使用的接口說明如表所示。接口名功能描述GeoConvert()創(chuàng)建GeoConvert實例對象。GeoConvert(Localelocale)根據(jù)自定義參數(shù)創(chuàng)建GeoConvert實例對象。getAddressFromLocation(doublelatitude,doublelongitude,intmaxItems)根據(jù)指定的經(jīng)緯度坐標獲取地理位置信息。緯度取值范圍為[-90,90],經(jīng)度取值范圍為[-180,180]。getAddressFromLocationName?(Stringdescription,intmaxItems)根據(jù)地理位置信息獲取相匹配的包含坐標數(shù)據(jù)的地址列表。getAddressFromLocationName?(Stringdescription,doubleminLatitude,doubleminLongitude,doublemaxLatitude,doublemaxLongitude,intmaxItems)根據(jù)指定的位置信息和地理區(qū)域獲取相匹配的包含坐標數(shù)據(jù)的地址列表。緯度取值范圍為[-90,90],經(jīng)度取值范圍為[-180,180]。11.5地理編碼轉化66地理編碼轉化開發(fā)步驟如下:實例化GeoConvert對象,所有與(逆)地理編碼轉化能力相關的功能API,都是通過GeoConvert提供的。GeoConvertgeoConvert=newGeoConvert();geoConvert.getAddressFromLocation(40.0,116.0,1);獲取轉化結果。調用getAddressFromLocation(doublelatitude,doublelongitude,intmaxItems),坐標轉化地理位置信息。調用getAddressFromLocationName(Stringdescription,intmaxItems)位置描述轉化坐標。geoConvert.getAddressFromLocationName("北京大興國際機場",1);參考開發(fā)者官網(wǎng)接口API說明,可以獲得與位置描述相匹配的GeoAddress列表,其中包含對應坐標數(shù)據(jù)11.1傳感器的概念11.4獲取設備位置信息11.7地圖開發(fā)CONTENTS11.6案例:獲取設備位置信息及逆地理編碼轉化68創(chuàng)建一個名為LocationDemo的應用來演示獲取設備位置信息及逆地理編碼轉化。使用獲取設備位置信息功能時需要申請權限,在config.json文件中的請求代碼如下:"reqPermissions":[{"name":"ohos.permission.LOCATION"},{"name":"ohos.permission.LOCATION_IN_BACKGROUND"}]因為ohos.permission.LOCATION為敏感權限,需要進行動態(tài)申請,在MainAbility中申請位置權限代碼如下:11.6案例:獲取設備位置信息及逆地理69publicclassMainAbilityextendsAbility{@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setMainRoute(MainAbilitySlice.class.getName());if(verifySelfPermission("oho

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論