W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
在應(yīng)用使用場景中,用戶經(jīng)常需要將一個應(yīng)用內(nèi)的數(shù)據(jù)(如文字、圖片等)分享至另一個應(yīng)用內(nèi)繼續(xù)操作。下面以PDF文件分享為例,介紹應(yīng)用間使用Want分享數(shù)據(jù)的方法。
數(shù)據(jù)分享涉及2個UIAbility組件(分享方和被分享方)和1個系統(tǒng)部件(應(yīng)用選擇框)。當(dāng)分享方通過startAbility接口發(fā)起數(shù)據(jù)分享后,將拉起應(yīng)用選擇框。其將隱式匹配并展示所有支持接受分享數(shù)據(jù)類型的應(yīng)用,由用戶主動選取,并由系統(tǒng)拉起點(diǎn)擊應(yīng)用完成數(shù)據(jù)的分享。
在本章節(jié)中,將繼續(xù)以按鈕形式來觸發(fā)分享,實(shí)際開發(fā)場景中并不局限于此,此章節(jié)著重講解分享時Want的配置。
本章節(jié)涉及的action:
分享方
Stage模型下經(jīng)常會遇到需要分享文件的場景,在這種場景下我們需要使用文件描述符(FD)來傳遞文件。此示例中,默認(rèn)已獲取分享文件的路徑。
- import fileIO from '@ohos.fileio';
- // let path = ...
- // file open where path is a variable contains the file path.
- let fileFd = fileIO.openSync(path, 0o102, 0o666);
在前提條件中介紹了分享的流程。分享方需先拉起應(yīng)用選擇框,并將數(shù)據(jù)分享給應(yīng)用選擇框,并由應(yīng)用選擇框代理傳遞至被分享方,完成分享。因此分享方的Want需使用2層嵌套,在第1層中使用隱式Want并配合“ohos.want.action.select”action拉起應(yīng)用選擇框,并在自定義字段parameters內(nèi)聲明一個完整的want作為第2層,其中聲明傳遞給被分享方的數(shù)據(jù)。
- import wantConstant from '@ohos.ability.wantConstant';
- // let path = ...
- // let fileFd = ...
- // let fileSize = ...
- let want = {
- // This action is used to implicitly match the application selctor.
- action: wantConstant.Action.ACTION_SELECT,
- // This is the custom parameter in the first layer of want
- // which is intended to add info to application selector.
- parameters: {
- // The MIME type of pdf
- "ability.picker.type": "application/pdf",
- "ability.picker.fileNames": [path],
- "ability.picker.fileSizes": [fileSize],
- // This a nested want which will be directly send to the user selected application.
- "ability.want.params.INTENT": {
- "action": "ohos.want.action.sendData",
- "type": "application/pdf",
- "parameters": {
- "keyFd": {"type": "FD", "value": fileFd}
- }
- }
- }
- }
以上代碼中使用Want自定義字段paramters,其中第一層paramters中的“ability.picker.*”字段用于傳遞展示信息給應(yīng)用選擇器,具體字段表示為:
例如:當(dāng)"ability.picker.type"為“application/pdf”,"ability.picker.fileNames"為“["接口文檔.pdf"]”,"ability.picker.fileSizes"為“[350 * 1024]”時,應(yīng)用選擇器將以下形式展示。
示例代碼中“ability.want.params.INTENT”字段是一個嵌套Want,內(nèi)部所含action、type等字段將由應(yīng)用選擇器進(jìn)行隱式匹配,具體隱式匹配規(guī)則可參考隱式Want匹配原理詳解。當(dāng)用戶選擇具體應(yīng)用后,“ability.want.params.INTENT”字段的嵌套Want將傳遞至所選應(yīng)用。
被分享方:
上文中提到,應(yīng)用選擇器通過“ability.want.params.INTENT”字段進(jìn)行隱式匹配。因此被分享方Ability配置文件內(nèi)(stage模型下的module.json5)skills字段需配置如下。
- "skills": [
- {
- "entities": [
- // ...
- ],
- "actions": [
- "ohos.want.action.sendData"
- // ...
- ],
- "uris": [
- {
- "type": "application/pdf"
- },
- // ...
- ]
- },
- ]
其中"actions"字段和“uris”內(nèi)“type”字段分別與“ability.want.params.INTENT”內(nèi)“action”,“type”字段匹配。
注意:當(dāng)前文件傳遞不支持uri方式傳遞,僅支持FD方式,但隱式匹配中,Want內(nèi)的“type”字段需與被分享方配置文件skills內(nèi)“uris”字段下的“type”字段匹配,因此skills內(nèi)的“uris”字段建議只聲明“type”字段,增加“host”,“port”等字段在上述示例中將匹配失敗。因?yàn)閼?yīng)用選擇框通過“ability.want.params.INTENT”發(fā)起隱式匹配,所以在“ability.want.params.INTENT”字段內(nèi)增加uri字段,且與skills內(nèi)的“uris”字段匹配時,仍可匹配成功且傳遞額外數(shù)據(jù)。
應(yīng)用選擇器拉起被分享方后,系統(tǒng)將調(diào)用其“onCreate”接口,并傳入“ability.want.params.INTENT”至其入?yún)ant內(nèi)。
- onCreate(want, launchParam) {
- // note when keyFd is undefined, app crash will happen.
- if (want["parameters"]["keyFd"] !== undefined) {
- // receive file descriptor
- let fd = want["parameters"]["keyFd"].value;
- // ...
- }
- }
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: