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
相关推荐
似的8356 小时前
一步一步学习使用FireMonkey动画() 使用TAnimator类创建动画
linux·学习·nginx
fanged7 小时前
总线学习3--SPI番外(TODO)
学习
ThsPool8 小时前
【遥感学习整理 02】ENVI遥感图像处理基础:从数据读取到遥感信息产品
图像处理·人工智能·学习
FF2501_940228589 小时前
HarmonyOS应用开发实战:猫猫大作战-在排行榜和历史记录查询中,排序是必不可少的操作【apple_product_name】
华为·harmonyos·鸿蒙
05664610 小时前
Python康复训练——常用标准库
开发语言·python·学习
05664610 小时前
Python康复训练——控制流与函数
开发语言·python·学习
想你依然心痛11 小时前
HarmonyOS ArkUI Swiper 轮播组件深度封装与工程化实践
swiper·arkui·lazyforeach·轮播组件·自动播放·指示器定制·一多适配
想你依然心痛11 小时前
HarmonyOS ArkUI Scroll 滚动容器组件深度封装与工程化实践
arkui·下拉刷新·scroll·上拉加载·lazyforeach·滚动容器·嵌套滚动
早睡早起身体好12312 小时前
为什么 Network 中会出现两个同名请求?——CORS 预检请求学习笔记
网络·笔记·学习·网络安全
菩提树下的打坐12 小时前
测试左移的更深一层:用 DDD 战术设计反推测试边界
学习