鸿蒙开发0基础【拉起文件处理类应用(startAbility)】

使用场景

开发者可以通过调用[startAbility]接口,由系统从已安装的应用中寻找符合要求的应用,打开特定文件。

例如,浏览器下应用下载PDF文件,可以调用此接口选择文件处理应用打开此PDF文件。开发者需要在请求中设置待打开文件的URI路径([uri])、文件格式([type])等字段,以便系统能够识别,直接拉起文件打开应用或弹出一个选择框,让用户选择合适的应用来打开文件,效果示意如下图所示。

图1 效果示意图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接口关键参数说明

开发者通过调用[startAbility]接口即可实现由已安装的垂域应用来打开文件。

表1 startAbility请求中[want]相关参数说明

参数名称类型是否必填说明
uristring表示待打开文件的URI路径,一般配合type使用。uri格式为:file://bundleName/path- file:文件URI的标志。- bundleName:该文件资源的属主。- path:文件资源在应用沙箱中的路径。
typestring表示MIME type类型描述,打开文件的类型。比如:‘text/xml’ 、 'image/'等,MIME定义请参见https://www.iana.org/assignments/media-types/media-types.xhtml?utm_source=ld246.com。**说明:*1. type为可选字段,如果不传type,系统会尝试根据uri后缀名判断文件类型进行匹配;如果传入type,必须确保与uri的文件类型一致,否则会导致无法匹配到合适的应用。文件后缀与文件类型的映射关系参见[Uniform Type Descriptor(UTD)预置列表]。2. 不支持传/
parametersRecord<string, Object>表示由系统定义,由开发者按需赋值的自定义参数,文件打开场景请参考表2。
flagsnumber表示处理方式,文件打开场景请参考表3。

表2 [parameters]相关参数说明

参数名称类型说明
ability.params.streamstring指示携带的文件URI要授权给目标方,用于待打开的文件存在其他文件依赖的场景。例如打开本地html文件依赖本地其余资源文件的场景等。对应的value必须是string类型的文件URI数组。文件URI的获取参考表1中uri参数。
ohos.ability.params.showDefaultPickerboolean表示是否强制展示文件打开方式的选择弹框,缺省为false。- false:表示由系统策略或默认应用设置决定直接拉起文件打开应用还是展示弹框。- true:表示始终展示弹框。
showCallerboolean表示调用方本身是否作为目标方应用之一参与匹配,缺省为false。- false:不参与匹配。- true:参与匹配。

表3 [flags]相关参数说明

参数名称说明
FLAG_AUTH_READ_URI_PERMISSION0x00000001指对URI执行读取操作的授权。
FLAG_AUTH_WRITE_URI_PERMISSION0x00000002指对URI执行写入操作的授权。

接入步骤

调用方接入步骤

  1. 导入相关模块。
// xxx.ets
import { fileUri } from '@kit.CoreFileKit';
import { UIAbility, Want, common, wantConstant } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { window } from '@kit.ArkUI';
  1. 获取[应用文件路径]。
// 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"
    }
    // ...
}
  1. 构造请求数据。
// 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
        };
    }
    // ...
}
  1. 调用接口启动。
// 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, AbilityConstant } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

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}`);
        }
    }
}
<think>我们正在讨论鸿蒙系统中的startAbility方法的使用。用户希望看到具体的示例和用法。根据鸿蒙系统开发文档,startAbility是用于启动Ability的方法。Ability是鸿蒙应用的基本组成单元,分为FA(FeatureAbility)和PA(ParticleAbility)模型。在FA模型中,我们通常使用AbilitySlice作为界面单元,而startAbility用于启动另一个Ability(可能是同一个应用内的,也可能是其他应用的)。使用步骤大致如下:1.创建Intent对象,指定要启动的Ability。2.设置Intent的操作(如果需要)以及携带的数据。3.调用startAbility(intent)方法。注意:如果要启动其他应用的Ability,需要确保目标Ability的可见性(即配置了相应的权限和意图过滤器)。下面是一个简单的示例,展示如何启动同一个应用内的另一个Ability(假设目标Ability名为com.example.demo.SecondAbility):</think>在鸿蒙系统中,`startAbility` 是启动应用组件(Ability)的核心方法。以下为完整使用示例及关键说明: ### 基础使用示例(Java) ```java // 在AbilitySlice中启动目标Ability Intent intent = new Intent(); Operation operation = new Intent.OperationBuilder() .withDeviceId("") // 本机留空 .withBundleName("com.example.targetapp") // 目标应用包名 .withAbilityName("com.example.targetapp.MainAbility") // 目标Ability全名 .build(); intent.setOperation(operation); // 启动目标Ability startAbility(intent); ``` ### 参数说明 1. **DeviceId** - 跨设备时填写目标设备ID - 本机启动留空字符串 `""` 2. **BundleName** - 目标应用包名(如:`com.weather.app`) 3. **AbilityName** - 目标Ability完整名(如:`com.weather.app.MainAbility`) ### 带参数启动示例 ```java // 添加参数传递 intent.setParam("city_code", "101010100"); // 键值对参数 intent.setParam("show_history", true); // 启动带参数的Ability startAbilityForResult(intent, REQUEST_CODE); // REQUEST_CODE为自定义请求码 ``` ### 异步结果处理 ```java @Override protected void onAbilityResult(int requestCode, int resultCode, Intent resultData) { if (requestCode == REQUEST_CODE && resultCode == 0) { String weatherData = resultData.getStringParam("weather"); // 处理返回数据 } } ``` ### 配置文件权限 在`config.json`中声明目标Ability: ```json "abilities": [ { "name": ".MainAbility", "visible": true // 必须设置为true才能被外部调用 } ] ``` ### 常见场景 1. **隐式启动**(通过Action触发) ```java Intent intent = new Intent(); intent.setAction("action.show.weather"); // 需与目标Ability的intentFilter匹配 ``` 2. **跨设备启动** 需配置分布式能力并申请权限: ```java operation.withDeviceId("123456789"); // 填入目标设备ID ``` > **注意事项** > - 目标应用的`visible`属性必须设为`true` > - 跨设备启动需申请`ohos.permission.DISTRIBUTED_DATASYNC`权限 > - 参数传递支持基本型/对象/Parcelable(需序列化)[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值