HarmonyOS Next开发学习手册——通过startAbility拉起文件处理类应用

使用场景

开发者可以通过调用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执行写入操作的授权。

接入步骤

调用方接入步骤

  1. 导入相关模块。

    // xxx.ets
    import { fileUri } from '@kit.CoreFileKit';
    import { UIAbility, Want, common, wantConstant } from '@kit.AbilityKit';
    import { BusinessError } from '@kit.BasicServiceKit';

  2. 获取 应用上下文Context 。

    // xxx.ets
    // 假设应用bundleName值为com.example.demo
    export default class EntryAbility extends UIAbility {
    onWindowStageCreate(windowStage: window.WindowStage) {
    // 获取文件沙箱路径
    let filePath = this.context.filesDir + '/test1.txt';
    // 将沙箱路径转换为uri
    let uri = fileUri.getUriFromPath(filePath);
    // 获取的uri为"file://com.example.demo/data/storage/el2/base/files/test.txt"
    }
    // ...
    }

  3. 构造请求数据。

    // xxx.ets
    export default class EntryAbility extends UIAbility {
    onWindowStageCreate(windowStage: window.WindowStage) {
    // 获取文件沙箱路径
    let filePath = this.context.filesDir + '/test.txt';
    // 将沙箱路径转换为uri
    let 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
    };
    }
    // ...
    }

  4. 调用接口启动。

    // xxx.ets
    export default class EntryAbility extends UIAbility {
    onWindowStageCreate(windowStage: window.WindowStage) {
    // 获取文件沙箱路径
    let filePath = this.context.filesDir + '/test.txt';
    // 将沙箱路径转换为uri
    let 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});
    });
    }
    // ...
    }

目标方接入步骤

  1. 声明文件打开能力

支持打开文件的应用需要在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的功能为文件打开
            }
            // ...
            ]
            // ...
        }
        ]
    }
    ]
}
}
  1. 应用处理待打开文件。

声明了文件打开的应用在被拉起后,获取传入的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
相关推荐
Long._.L21 分钟前
【python爬虫】豆瓣爬虫学习
爬虫·python·学习
2401_8554507926 分钟前
安卓短视频去水印v1.7 简洁好用
经验分享·笔记·学习
鼾声鼾语37 分钟前
simulink-esp32开发foc电机
开发语言·stm32·单片机·嵌入式硬件·学习
阿维同学1 小时前
今天不看文章,明天变垃圾(明天收费)-----字节数据分析发展过程中所遭遇的挑战
数据库·学习·安全·数据挖掘·数据分析·云计算
Dicheng Li的学习记录1 小时前
《数据结构与算法基础 by王卓老师》学习笔记——2.4线性表的顺序表示和实现3
数据结构·笔记·学习·算法
不怕娜2 小时前
【golang学习之旅】复杂数据类型——指针 & 函数
开发语言·学习·golang
whltaoin2 小时前
HarmonyOS APP应用开发项目- MCA助手(Day02持续更新中~)
harmonyos·arkts·移动应用开发
小狗爱吃黄桃罐头2 小时前
江协科技51单片机学习- p21 LED点阵屏(8*8)
科技·学习·51单片机
无名之逆2 小时前
Rust详解日志
java·服务器·开发语言·数据库·学习·算法·rust
yuzhangfeng2 小时前
【TensorFlow深度学习】图像旋转预测:一个无监督表征学习的实践案例
人工智能·深度学习·学习·机器学习·tensorflow