HarmonyOS 鸿蒙Next want使用系统软件方式打开文件
HarmonyOS 鸿蒙Next want使用系统软件方式打开文件 帮忙看一下是哪边的代码有异常,想利用系统软件打开下面的docx文档,一直提示‘暂无支持此类文件的应用’
let downloadUrl = "xx"
//通过ohos.request下载文件 并计算耗时时间
static ohosDownload(context: Context, downloadUrl: string, filename: string) {
let downFileData: DownFileData = new DownFileData()
let beginDownloadTime = systemDateTime.getTime();
let dirPath = context.filesDir + Constants.filesDir;
if (!fs.accessSync(dirPath)) {
fs.mkdirSync(dirPath, true);
}
let filePath = dirPath + filename
try {
//文件是否存在,如果文件已存在,则先删除文件。
if (fs.accessSync(filePath)) {
fs.unlinkSync(filePath); //删除文件
}
} catch (err) {
}
return new Promise<DownFileData>((resolve) => {
request.downloadFile(context, {
url: downloadUrl,
filePath: filePath
}).then((data: request.DownloadTask) => {
let downloadTask: request.DownloadTask = data;
downloadTask.on('complete', () => {
let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE);
fs.closeSync(file);
let newPath = FileUtil.getInstance().getUriFromPath(filePath)
let context = getContext() as common.UIAbilityContext;
let want: Want = {
// 配置被分享文件的读写权限,例如对被分享应用进行读写授权
flags: wantConstant.Flags.FLAG_AUTH_WRITE_URI_PERMISSION | wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION,
// 配置分享应用的隐式拉起规则
action: 'ohos.want.action.sendData',
uri: newPath,
type: FileUtil.getInstance().getMIMEType(FileUtil.getInstance().getFileType(rsp.data.url))
}
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}`);
});
})
}).catch((err: BusinessError) => {
console.error(`Invoke downloadTask failed, code is ${err.code}, message is ${err.message}`);
});
})
}
更多关于HarmonyOS 鸿蒙Next want使用系统软件方式打开文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
应用可以通过调用元能力的startAbility
接口传入隐式Want来打开文件,若匹配到一个满足条件的应用则直接启动该应用;若匹配到多个满足条件的应用(UIAbility)则弹出选择框让用户选择,以下以打开Word文件为例。
宿主应用开发步骤
宿主应用即文件打开的发起者,通过调用系统接口打开指定文件。
调用接口启动
// 调用元能力提供的startAbility接口启动应用
context.startAbility(wantInfo).then(() => {
// ...
}).catch((err: BusinessError) => {
// ...
})
目标应用开发步骤
目标应用即文件打开能力的提供者,需要在应用中声明应用打开能力并构建相关的能力,使得包管理服务可以识别到应用支持文件打开的能力。
// 导入相关模块
import common from '@ohos.app.ability.common';
import { Want } from '@ohos.app.ability.Want';
import { BusinessError } from '@ohos.base';
//构造请求数据
// 构造请求数据Want
let wantInfo: Want = {
action: 'ohos.want.action.viewData', // 查看数据的action
uri: 'file://.../test.docx', // 表示打开文件的URI路径,一般配合type使用
type: 'application/msword', // 表示MIME type类型描述,打开文件的类型
flags: 2, // 1:表示对URI执行读取操作的授权; 2:表示对URI执行写入操作的授权
parameters: {
// 开发者传入的键值对,以下仅为示例
fileName: 'test.docx'
}
}
module.json5注册文件打开能力
{
"module": {
...
"abilities": [
{
...
"skills": [
{
...
"actions": [
"ohos.want.action.viewData" // 声明文件打开能力
...
],
"uris": [
{
// 允许打开uri中以file://协议开头标识本地的word文件
"scheme": "file",
"type": "application/msword" // 表示MIME type类型描述,打开文件的类型
}
...
]
...
}
]
}
]
}
实现UIAbility
import { AbilityConstant } from '@ohos.app.ability.AbilityConstant';
import { UIAbility } from '@ohos.app.ability.UIAbility';
import { Want } from '@ohos.app.ability.Want';
import { window } from '@ohos.window';
export default class DemoUIAbility extends UIAbility {
private storage: LocalStorage = new LocalStorage();
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
console.info('DemoUIAbility, onCreate');
// 从want中获取打开文件的相关参数信息,以下仅为示例
let fileName: string = want.parameters?.fileName as string ?? '';
this.storage.setOrCreate('fileName', fileName);
...
}
onDestroy(): void {
console.info('DemoUIAbility, onDestroy');
}
onWindowStageCreate(windowStage: window.WindowStage): void {
console.info('DemoUIAbility, onWindowStageCreate');
// 加载页面
windowStage.loadContent('pages/Index', this.storage, (err, data) => {
if (err.code) {
console.error('DemoUIAbility, failed to load the content. Cause: %{public}s',
JSON.stringify(err) ?? '');
return;
}
console.info('DemoUIAbility, succeeded in loading the content. Data: %{public}s',
JSON.stringify(data) ?? '');
...
});
}
onWindowStageDestroy(): void {
console.info('DemoUIAbility, onWindowStageDestroy');
}
...
}
更多关于HarmonyOS 鸿蒙Next want使用系统软件方式打开文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
针对帖子标题“HarmonyOS 鸿蒙Next want使用系统软件方式打开文件”的问题,以下是专业且简洁的回答:
在HarmonyOS鸿蒙系统中,若要通过系统软件方式打开文件,通常需要使用Intent(在鸿蒙中可能以特定的API或机制实现,但概念类似)来指定要打开的文件以及目标应用程序。
-
确定文件路径和类型:首先,你需要获取要打开文件的路径和类型(如.txt、.jpg等)。
-
构建Intent:在鸿蒙系统中,你可能需要使用特定的API来构建一个意图(Intent),该意图包含文件的URI、MIME类型以及可能的额外信息。
-
启动目标应用:使用系统提供的API,根据构建的Intent启动能够处理该文件类型的应用程序。
-
处理权限:确保你的应用有权限访问目标文件,并且目标应用有权限读取和处理该文件类型。
请注意,由于鸿蒙系统的API和机制可能与Android有所不同,因此你需要参考鸿蒙系统的官方文档来获取具体的API调用方式和参数。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html,