應(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)用文件路徑]。
獲取文件在應(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" } }
設(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 效果示意圖:
使用其他應(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)行讀寫操作。
`HarmonyOS與OpenHarmony鴻蒙文檔籽料: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}`);
}
}
審核編輯 黃宇
-
接口
+關(guān)注
關(guān)注
33文章
8459瀏覽量
150745 -
框架
+關(guān)注
關(guān)注
0文章
398瀏覽量
17409 -
鴻蒙
+關(guān)注
關(guān)注
57文章
2305瀏覽量
42696
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論