使用場景
開發者可以通過調用startAbility接口,由系統從已安裝的應用中尋找符合要求的應用來實現打開特定文件的意圖,例如:瀏覽器下應用下載PDF文件,可以調用此接口選擇文件處理應用打開此PDF文件。開發者需要在請求中設置待打開文件的URI路徑(uri)、文件格式(type)等字段,以便系統能夠識別,直接拉起文件打開應用或彈出一個選擇框,讓用戶選擇合適的應用來打開文件,效果示意如下圖所示。
圖1 效果示意圖
接口關鍵參數說明
開發者通過調用 startAbility 接口即可實現由已安裝的垂域應用來打開文件。
表1 startAbility請求中want相關參數說明
參數名稱 | 類型 | 是否必填 | 說明 |
---|---|---|---|
uri | string | 是 | 表示待打開文件的URI路徑,一般配合type使用。 uri格式為:file://bundleName/path * file:文件URI的標志。 * bundleName:該文件資源的屬主。* path:文件資源在應用沙箱中的路徑。 |
type | string | 否 | 表示MIME type類型描述,打開文件的類型。比如:‘text/xml’ 、 'image/*'等,MIME定義請參見https://www.iana.org/assignments/media-types/media-types.xhtml?utm_source=ld246.com。 |
parameters | Record<string, Object> | 否 | 表示由系統定義,由開發者按需賦值的自定義參數,文件打開場景請參考表2。 |
flags | number | 否 | 表示處理方式,文件打開場景請參考表3。 |
表2?parameters 相關參數說明
參數名稱 | 類型 | 說明 |
---|---|---|
ability.params.stream | string | 指示攜帶的文件URI要授權給目標方,用于待打開的文件存在其他文件依賴的場景。例如打開本地html文件依賴本地其余資源文件的場景等。對應的value必須是string類型的文件URI數組。文件URI的獲取參考表1中uri參數。 |
ohos.ability.params.showDefaultPicker | string | 表示在系統僅找到一個應用打開文件的場景下,是否需要展示選擇文件打開方式的彈框來給用戶選擇。 * false:表示由系統策略或默認應用設置決定直接拉起文件打開應用還是展示彈框。 * true:表示始終展示彈框。缺省為false。 |
表3? flags 相關參數說明
參數名稱 | 值 | 說明 |
---|---|---|
FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | 指對URI執行讀取操作的授權。 |
FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | 指對URI執行寫入操作的授權。 |
接入步驟
調用方接入步驟
- 導入相關模塊。
// xxx.ets
import { fileUri } from '@kit.CoreFileKit';
import { UIAbility, Want, common, wantConstant } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServiceKit';
- 獲取 應用上下文Context 。
// xxx.ets
// 假設應用bundleName值為com.example.demo
export default class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage: window.WindowStage) {// 獲取文件沙箱路徑let filePath = this.context.filesDir + '/test1.txt';// 將沙箱路徑轉換為urilet uri = fileUri.getUriFromPath(filePath);// 獲取的uri為"file://com.example.demo/data/storage/el2/base/files/test.txt"
}
// ...
}
- 構造請求數據。
// xxx.ets
export default class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage: window.WindowStage) {// 獲取文件沙箱路徑let filePath = this.context.filesDir + '/test.txt';// 將沙箱路徑轉換為urilet uri = fileUri.getUriFromPath(filePath);// 構造請求數據let want: Want = {uri: uri,type: 'text/plain', // 表示待打開文件的類型// 配置被分享文件的讀寫權限,例如對文件打開應用進行讀寫授權flags: wantConstant.Flags.FLAG_AUTH_WRITE_URI_PERMISSION | wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION};
}
// ...
}
- 調用接口啟動。
// xxx.ets
export default class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage: window.WindowStage) {// 獲取文件沙箱路徑let filePath = this.context.filesDir + '/test.txt';// 將沙箱路徑轉換為urilet uri = fileUri.getUriFromPath(filePath);// 構造請求數據let want: Want = {uri: uri,type: 'text/plain', // 表示待打開文件的類型// 配置被分享文件的讀寫權限,例如對文件打開應用進行讀寫授權flags: wantConstant.Flags.FLAG_AUTH_WRITE_URI_PERMISSION | wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION};// 調用接口啟動this.context.startAbility(want).then(() => {console.info('Succeed to invoke startAbility.');}).catch((err: BusinessError) => {console.error(`Failed to invoke startAbility, code: ${err.code}, message: ${err.message}`);});
}
// ...
}
目標方接入步驟
- 聲明文件打開能力
支持打開文件的應用需要在module.json5配置文件中聲明文件打開能力。其中uris字段表示接收URI的類型,其中scheme固定為file。type字段表示支持打開的文件類型(請參見MIME定義),如下舉例中類型為txt文件。
{
"module": {// ..."abilities": [{// ..."skills": [{"actions": ["ohos.want.action.viewData" // 必填,聲明數據處理能力],"uris": [{// 允許打開uri中以file://協議開頭標識的本地文件"scheme": "file", // 必填,聲明協議類型為文件"type": "text/plain", // 必填,表示支持打開的文件類型"linkFeature": "FileOpen" // 必填,表示此URI的功能為文件打開}// ...]// ...}]}]
}
}
- 應用處理待打開文件。
聲明了文件打開的應用在被拉起后,獲取傳入的Want參數信息,從中獲取待打開文件的URI,在打開文件并獲取對應的file對象后,可對文件進行讀寫操作。
// xxx.ets
import fs from '@ohos.file.fs';
import { Want } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServiceKit';export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {// 從want信息中獲取uri字段let uri = want.uri;if (uri == null || uri == undefined) {console.info('uri is invalid');return;}try {// 根據待打開文件的URI進行相應操作。例如同步讀寫的方式打開URI獲取file對象let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);console.info('Succeed to open file.');} catch (err) {let error: BusinessError = err as BusinessError;console.error(`Failed to open file openSync, code: ${error.code}, message: ${error.message}`);}}
}
鴻蒙全棧開發全新學習指南
也為了積極培養鴻蒙生態人才,讓大家都能學習到鴻蒙開發最新的技術,針對一些在職人員、0基礎小白、應屆生/計算機專業、鴻蒙愛好者等人群,整理了一套純血版鴻蒙(HarmonyOS Next)全棧開發技術的學習路線【包含了大廠APP實戰項目開發】。
本路線共分為四個階段:
第一階段:鴻蒙初中級開發必備技能
第二階段:鴻蒙南北雙向高工技能基礎:gitee.com/MNxiaona/733GH
第三階段:應用開發中高級就業技術
第四階段:全網首發-工業級南向設備開發就業技術:gitee.com/MNxiaona/733GH
鴻蒙開發面試真題(含參考答案):gitee.com/MNxiaona/733GH
寫在最后
- 如果你覺得這篇內容對你還蠻有幫助,我想邀請你幫我三個小忙:
- 點贊,轉發,有你們的 『點贊和評論』,才是我創造的動力。
- 關注小編,同時可以期待后續文章ing🚀,不定期分享原創知識。
- 想要獲取更多完整鴻蒙最新學習資源,請移步前往小編:
gitee.com/MNxiaona/733GH