應(yīng)用間使用Want分享數(shù)據(jù)

2024-01-25 12:26 更新

在應(yīng)用使用場景中,用戶經(jīng)常需要將一個應(yīng)用內(nèi)的數(shù)據(jù)(如文字、圖片等)分享至另一個應(yīng)用內(nèi)繼續(xù)操作。下面以PDF文件分享為例,介紹應(yīng)用間使用Want分享數(shù)據(jù)的方法。

前提條件

  1. 數(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ù)的分享。

  2. 在本章節(jié)中,將繼續(xù)以按鈕形式來觸發(fā)分享,實(shí)際開發(fā)場景中并不局限于此,此章節(jié)著重講解分享時Want的配置。

  3. 本章節(jié)涉及的action:

    • ACTION_SELECT (ohos.want.action.select):指示顯示應(yīng)用程序選擇框的操作。用于拉起應(yīng)用選擇框。
    • ACTION_SEND_DATA (ohos.want.action.sendData):指示發(fā)送單個數(shù)據(jù)記錄的操作。用于傳遞數(shù)據(jù)至分享方。

開發(fā)步驟

  • 分享方

    1. Stage模型下經(jīng)常會遇到需要分享文件的場景,在這種場景下我們需要使用文件描述符(FD)來傳遞文件。此示例中,默認(rèn)已獲取分享文件的路徑。

      1. import fileIO from '@ohos.fileio';
      2. // let path = ...
      3. // file open where path is a variable contains the file path.
      4. let fileFd = fileIO.openSync(path, 0o102, 0o666);
    2. 在前提條件中介紹了分享的流程。分享方需先拉起應(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ù)。

      1. import wantConstant from '@ohos.ability.wantConstant';
      2. // let path = ...
      3. // let fileFd = ...
      4. // let fileSize = ...
      5. let want = {
      6. // This action is used to implicitly match the application selctor.
      7. action: wantConstant.Action.ACTION_SELECT,
      8. // This is the custom parameter in the first layer of want
      9. // which is intended to add info to application selector.
      10. parameters: {
      11. // The MIME type of pdf
      12. "ability.picker.type": "application/pdf",
      13. "ability.picker.fileNames": [path],
      14. "ability.picker.fileSizes": [fileSize],
      15. // This a nested want which will be directly send to the user selected application.
      16. "ability.want.params.INTENT": {
      17. "action": "ohos.want.action.sendData",
      18. "type": "application/pdf",
      19. "parameters": {
      20. "keyFd": {"type": "FD", "value": fileFd}
      21. }
      22. }
      23. }
      24. }

      以上代碼中使用Want自定義字段paramters,其中第一層paramters中的“ability.picker.*”字段用于傳遞展示信息給應(yīng)用選擇器,具體字段表示為:

      • "ability.picker.type":應(yīng)用選擇器根據(jù)該字段渲染相應(yīng)的文件類型圖標(biāo)。
      • "ability.picker.fileNames":應(yīng)用選擇器根據(jù)該字段展示文件名。
      • "ability.picker.fileSizes":應(yīng)用選擇器根據(jù)該字段展示文件大小。以字節(jié)為單位。
      • "ability.picker.fileNames"與"ability.picker.fileSizes"為數(shù)組,其有一一對應(yīng)關(guān)系。

      例如:當(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)用。

  • 被分享方:

    1. 上文中提到,應(yīng)用選擇器通過“ability.want.params.INTENT”字段進(jìn)行隱式匹配。因此被分享方Ability配置文件內(nèi)(stage模型下的module.json5)skills字段需配置如下。

      1. "skills": [
      2. {
      3. "entities": [
      4. // ...
      5. ],
      6. "actions": [
      7. "ohos.want.action.sendData"
      8. // ...
      9. ],
      10. "uris": [
      11. {
      12. "type": "application/pdf"
      13. },
      14. // ...
      15. ]
      16. },
      17. ]

      其中"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ù)。

    2. 應(yīng)用選擇器拉起被分享方后,系統(tǒng)將調(diào)用其“onCreate”接口,并傳入“ability.want.params.INTENT”至其入?yún)ant內(nèi)。

      1. onCreate(want, launchParam) {
      2. // note when keyFd is undefined, app crash will happen.
      3. if (want["parameters"]["keyFd"] !== undefined) {
      4. // receive file descriptor
      5. let fd = want["parameters"]["keyFd"].value;
      6. // ...
      7. }
      8. }
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號