0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙Ability Kit(程序框架服務(wù))【應(yīng)用間使用Want分享數(shù)據(jù)】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-06-07 15:19 ? 次閱讀

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

在應(yīng)用使用場(chǎng)景中,用戶經(jīng)常需要將應(yīng)用內(nèi)的數(shù)據(jù)(如文字、圖片等)分享至其他應(yīng)用以供進(jìn)一步處理。Want支持實(shí)現(xiàn)應(yīng)用間的數(shù)據(jù)分享。

應(yīng)用文件分享

應(yīng)用文件分享是應(yīng)用之間通過分享URI(Uniform Resource Identifier)或文件描述符FD(File Descriptor)的方式,進(jìn)行文件共享的過程。

  • 基于URI分享方式,應(yīng)用可分享單個(gè)文件,通過[ohos.app.ability.wantConstant]的wantConstant.Flags接口以只讀或讀寫權(quán)限授權(quán)給其他應(yīng)用。應(yīng)用可通過[ohos.file.fs]的open接口打開URI,并進(jìn)行讀寫操作。當(dāng)前僅支持臨時(shí)授權(quán),分享給其他應(yīng)用的文件在被分享應(yīng)用退出時(shí)權(quán)限被收回。
  • 基于FD分享方式,應(yīng)用可分享單個(gè)文件,通過ohos.file.fs的open接口以指定權(quán)限授權(quán)給其他應(yīng)用。應(yīng)用從Want中解析拿到FD后可通過ohos.file.fs的讀寫接口對(duì)文件進(jìn)行讀寫。

由于FD分享的文件關(guān)閉FD后,無法再打開分享文件,因此不推薦使用,本文重點(diǎn)介紹基于URI[分享文件給其他應(yīng)用]或[使用其他應(yīng)用分享的文件]。

應(yīng)用可分享目錄

沙箱路徑物理路徑說明 開發(fā)前請(qǐng)熟悉鴻蒙開發(fā)指導(dǎo)文檔:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md點(diǎn)擊或者復(fù)制轉(zhuǎn)到。
/data/storage/el1/base/data/app/el1//base/應(yīng)用el1級(jí)別加密數(shù)據(jù)目錄
/data/storage/el2/base/data/app/el2//base/應(yīng)用el2級(jí)別加密數(shù)據(jù)目錄
/data/storage/el2/distributedfiles/mnt/hmdfs//account/device_view//data/應(yīng)用el2加密級(jí)別有帳號(hào)分布式數(shù)據(jù)融合目錄

文件URI規(guī)范

文件URI的格式為:

格式為file:///

  • file:文件URI的標(biāo)志。
  • bundleName:該文件資源的屬主。
  • path:文件資源在應(yīng)用沙箱中的路徑。

分享文件給其他應(yīng)用

在分享文件給其他應(yīng)用前,開發(fā)者需要先[獲取應(yīng)用文件路徑]。

  1. 獲取文件在應(yīng)用沙箱中的路徑,并轉(zhuǎn)換為文件URI。

    import UIAbility from '@ohos.app.ability.UIAbility';
    import fileUri from '@ohos.file.fileuri';
    import window from '@ohos.window';
    
    export default class EntryAbility extends UIAbility {
      onWindowStageCreate(windowStage: window.WindowStage) {
        // 獲取文件的沙箱路徑
        let pathInSandbox = this.context.filesDir + "/test1.txt";
        // 將沙箱路徑轉(zhuǎn)換為uri
        let uri = fileUri.getUriFromPath(pathInSandbox);
        // 獲取的uri為"file://com.example.demo/data/storage/el2/base/files/test.txt"
      }
    }
    
  2. 設(shè)置獲取文件的權(quán)限以及選擇要分享的應(yīng)用。 分享文件給其他應(yīng)用需要使用[startAbility]接口,將獲取到的URI填充在want的參數(shù)uri中,標(biāo)注URI的文件類型,type字段可參考[Want屬性],并通過設(shè)置want的flag來設(shè)置對(duì)應(yīng)的讀寫權(quán)限,action字段配置為"ohos.want.action.sendData"表示進(jìn)行應(yīng)用文件分享,開發(fā)示例如下。

    說明:

    寫權(quán)限分享時(shí),同時(shí)授予讀權(quán)限。

    import fileUri from '@ohos.file.fileuri';
    import window from '@ohos.window';
    import wantConstant from '@ohos.app.ability.wantConstant';
    import UIAbility from '@ohos.app.ability.UIAbility';
    import Want from '@ohos.app.ability.Want';
    import { BusinessError } from '@ohos.base';
    
    export default class EntryAbility extends UIAbility {
      onWindowStageCreate(windowStage: window.WindowStage) {
        // 獲取文件沙箱路徑
        let filePath = this.context.filesDir + '/test1.txt';
        // 將沙箱路徑轉(zhuǎn)換為uri
        let uri = fileUri.getUriFromPath(filePath);
        let want: Want  = {
          // 配置被分享文件的讀寫權(quán)限,例如對(duì)被分享應(yīng)用進(jìn)行讀寫授權(quán)
          flags: wantConstant.Flags.FLAG_AUTH_WRITE_URI_PERMISSION | wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION,
          // 配置分享應(yīng)用的隱式拉起規(guī)則
          action: 'ohos.want.action.sendData',
          uri: uri,
          type: 'text/plain'
        }
        this.context.startAbility(want)
          .then(() = > {
            console.info('Invoke getCurrentBundleStats succeeded.');
          })
          .catch((err: BusinessError) = > {
            console.error(`Invoke startAbility failed, code is ${err.code}, message is ${err.message}`);
          });
      }
      // ...
    }
    

圖1 效果示意圖:
share-app-file

使用其他應(yīng)用分享的文件

被分享應(yīng)用需要在[module.json5配置文件]的actions標(biāo)簽的值配置為"ohos.want.action.sendData",表示接收應(yīng)用分享文件,配置uris字段,表示接收URI的類型,即只接收其他應(yīng)用分享該類型的URI,如下表示本應(yīng)用只接收scheme為file,類型為txt的文件,示例如下。

{
  "module": {
    ...
    "abilities": [
      {
        ...
        "skills": [
          {
            ...
            "actions": [
              "ohos.want.action.sendData"
            ],
            "uris": [
              {
                "scheme": "file",
                "type": "text/plain"
              }
           ]
          }
        ]
      }
    ]
  }
}

被分享方的UIAbility被啟動(dòng)后,可以在其[onCreate()]或者[onNewWant]回調(diào)中獲取傳入的Want參數(shù)信息。

通過接口want的參數(shù)獲取分享文件的URI,獲取文件URI后通過fs.open接口打開文件,獲取對(duì)應(yīng)的file對(duì)象后,可對(duì)文件進(jìn)行讀寫操作。
鴻蒙文檔.png

`HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789是v直接拿`
// xxx.ets
import fs from '@ohos.file.fs';
import Want from '@ohos.app.ability.Want';
import { BusinessError } from '@ohos.base';

function getShareFile() {
  try {
    let want: Want = {}; // 此處實(shí)際使用時(shí)應(yīng)該修改為獲取到的分享方傳遞過來的want信息

    // 從want信息中獲取uri字段
    let uri = want.uri;
    if (uri == null || uri == undefined) {
      console.info('uri is invalid');
      return;
    }
    try {
      // 根據(jù)需要對(duì)被分享文件的URI進(jìn)行相應(yīng)操作。例如讀寫的方式打開URI獲取file對(duì)象
      let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);
      console.info('open file successfully!');
    } catch (err) {
      let error: BusinessError = err as BusinessError;
      console.error(`Invoke openSync failed, code is ${error.code}, message is ${error.message}`);
    }
  } catch (error) {
    let err: BusinessError = error as BusinessError;
    console.error(`Invoke openSync failed, code is ${err.code}, message is ${err.message}`);
  }
}

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8459

    瀏覽量

    150745
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    398

    瀏覽量

    17409
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2305

    瀏覽量

    42696
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙開發(fā)接口Ability框架:【@ohos.application.Ability (Ability)】

    Ability模塊提供對(duì)Ability生命周期、上下文環(huán)境等調(diào)用管理的能力,包括Ability創(chuàng)建、銷毀、轉(zhuǎn)儲(chǔ)客戶端信息等。
    的頭像 發(fā)表于 04-30 17:42 ?2188次閱讀
    <b class='flag-5'>鴻蒙</b>開發(fā)接口<b class='flag-5'>Ability</b><b class='flag-5'>框架</b>:【@ohos.application.<b class='flag-5'>Ability</b> (<b class='flag-5'>Ability</b>)】

    鴻蒙開發(fā)接口Ability框架:【 (Context模塊)】

    Context模塊提供了ability或application的上下文的能力,包括允許訪問特定于應(yīng)用程序的資源、請(qǐng)求和驗(yàn)證權(quán)限等。
    的頭像 發(fā)表于 05-13 16:04 ?654次閱讀
    <b class='flag-5'>鴻蒙</b>開發(fā)接口<b class='flag-5'>Ability</b><b class='flag-5'>框架</b>:【 (Context模塊)】

    鴻蒙Ability Kit程序框架服務(wù))【ServiceExtensionAbility】

    [ServiceExtensionAbility]是SERVICE類型的ExtensionAbility組件,提供后臺(tái)服務(wù)能力,其內(nèi)部持有了一個(gè)[ServiceExtensionContext],通過[ServiceExtensionContext]提供了豐富的接口供外部使用。
    的頭像 發(fā)表于 06-04 14:50 ?1092次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【ServiceExtensionAbility】

    鴻蒙Ability Kit程序框架服務(wù))【UIExtensionAbility】

    [UIExtensionAbility]是UI類型的ExtensionAbility組件,需要與[UIExtensionComponent]一起配合使用,開發(fā)者可以在UIAbility的頁(yè)面中通過UIExtensionComponent嵌入提供方應(yīng)用的UIExtensionAbility提供的UI。UIExtensionAbility會(huì)在獨(dú)立于UIAbility的進(jìn)程中運(yùn)行,完成其頁(yè)面的布局和渲染。常用于有進(jìn)程隔離訴求的系統(tǒng)彈窗、狀態(tài)欄、膠囊等模塊化開發(fā)的場(chǎng)景。
    的頭像 發(fā)表于 06-05 09:19 ?1268次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【UIExtensionAbility】

    鴻蒙Ability開發(fā)-Stage模型下Ability的創(chuàng)建和使用

    函數(shù) HiLog日志系統(tǒng)可以讓應(yīng)用按照指定類型、指定級(jí)別、指定格式字符串打印日志內(nèi)容,幫助開發(fā)者了解應(yīng)用/服務(wù)的運(yùn)行狀態(tài),更好地調(diào)試程序。 HiLog提供了debug、info、warn、error以及fatal
    發(fā)表于 01-08 15:34

    跟阿斌一起學(xué)鴻蒙(2): Ability vs App?

    ,程序員們依然可以為你實(shí)現(xiàn),只是實(shí)現(xiàn)起來會(huì)相對(duì)麻煩,比如各種遠(yuǎn)程通信,各種數(shù)據(jù)和狀態(tài)的同步,還有各種聯(lián)調(diào)和測(cè)試。而鴻蒙OS,將很多麻煩的處理過程整合到操作系統(tǒng)中,借此希望讓程序員們可以
    發(fā)表于 11-30 20:56

    鴻蒙開發(fā)接口Ability框架:【@ohos.application.Want (Want)】

    Want模塊提供系統(tǒng)的基本通信組件的能力。
    的頭像 發(fā)表于 05-11 09:39 ?370次閱讀
    <b class='flag-5'>鴻蒙</b>開發(fā)接口<b class='flag-5'>Ability</b><b class='flag-5'>框架</b>:【@ohos.application.<b class='flag-5'>Want</b> (<b class='flag-5'>Want</b>)】

    鴻蒙應(yīng)用模型:【Ability Kit】簡(jiǎn)介

    Ability Kit程序框架服務(wù))提供了應(yīng)用程序開發(fā)和運(yùn)行的應(yīng)用模型,是系統(tǒng)為開發(fā)者提供的應(yīng)
    的頭像 發(fā)表于 05-29 14:41 ?559次閱讀
    <b class='flag-5'>鴻蒙</b>應(yīng)用模型:【<b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>】簡(jiǎn)介

    鴻蒙Ability Kit程序框架服務(wù))【Ability內(nèi)頁(yè)面間的跳轉(zhuǎn)】

    基于Stage模型下的Ability開發(fā),實(shí)現(xiàn)Ability內(nèi)頁(yè)面間的跳轉(zhuǎn)和數(shù)據(jù)傳遞。
    的頭像 發(fā)表于 06-03 20:43 ?262次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【<b class='flag-5'>Ability</b>內(nèi)頁(yè)面間的跳轉(zhuǎn)】

    鴻蒙Ability Kit程序框架服務(wù))【ExtensionAbility組件】

    ExtensionAbility組件是基于特定場(chǎng)景(例如服務(wù)卡片、輸入法等)提供的應(yīng)用組件,以便滿足更多的使用場(chǎng)景。
    的頭像 發(fā)表于 06-04 15:54 ?462次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【ExtensionAbility組件】

    鴻蒙Ability Kit程序框架服務(wù))【Ability與ServiceExtensionAbility通信】

    本示例展示通過[IDL的方式]和?[@ohos.rpc]?等接口實(shí)現(xiàn)了Ability與ServiceExtensionAbility之間的通信。
    的頭像 發(fā)表于 06-05 09:28 ?440次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【<b class='flag-5'>Ability</b>與ServiceExtensionAbility通信】

    鴻蒙Ability Kit程序框架服務(wù))【Want概述】

    [Want]是一種對(duì)象,用于在應(yīng)用組件之間傳遞信息。
    的頭像 發(fā)表于 06-06 09:16 ?468次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【<b class='flag-5'>Want</b>概述】

    鴻蒙Ability Kit程序框架服務(wù))【顯式Want與隱式Want匹配規(guī)則】

    在啟動(dòng)目標(biāo)應(yīng)用組件時(shí),會(huì)通過顯式[Want]或者隱式[Want]進(jìn)行目標(biāo)應(yīng)用組件的匹配,這里說的匹配規(guī)則就是調(diào)用方傳入的[want]參數(shù)中設(shè)置的參數(shù)如何與目標(biāo)應(yīng)用組件聲明的配置文件進(jìn)行匹配。
    的頭像 發(fā)表于 06-06 14:30 ?416次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【顯式<b class='flag-5'>Want</b>與隱式<b class='flag-5'>Want</b>匹配規(guī)則】

    鴻蒙Ability Kit程序框架服務(wù))【應(yīng)用啟動(dòng)框架AppStartup】

    `AppStartup`提供了一種更加簡(jiǎn)單高效的初始化組件的方式,支持異步初始化組件加速應(yīng)用的啟動(dòng)時(shí)間。使用啟動(dòng)框架應(yīng)用開發(fā)者只需要分別為待初始化的組件實(shí)現(xiàn)`AppStartup`提供
    的頭像 發(fā)表于 06-10 18:38 ?654次閱讀

    鴻蒙開發(fā)Ability Kit程序框架服務(wù):任務(wù)管理

    AbilityRecord:系統(tǒng)服務(wù)側(cè)管理一個(gè)UIAbility實(shí)例的最小單元,對(duì)應(yīng)一個(gè)應(yīng)用側(cè)的UIAbility組件實(shí)例。系統(tǒng)服務(wù)側(cè)管理UIAbility實(shí)例數(shù)量上限為512個(gè)。
    的頭像 發(fā)表于 06-24 14:46 ?383次閱讀
    <b class='flag-5'>鴻蒙</b>開發(fā)<b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b><b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>:任務(wù)管理