HarmonyOS 鸿蒙Next want使用系统软件方式打开文件

发布于 1周前 作者 nodeper 来自 鸿蒙OS

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

3 回复

应用可以通过调用元能力的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或机制实现,但概念类似)来指定要打开的文件以及目标应用程序。

  1. 确定文件路径和类型:首先,你需要获取要打开文件的路径和类型(如.txt、.jpg等)。

  2. 构建Intent:在鸿蒙系统中,你可能需要使用特定的API来构建一个意图(Intent),该意图包含文件的URI、MIME类型以及可能的额外信息。

  3. 启动目标应用:使用系统提供的API,根据构建的Intent启动能够处理该文件类型的应用程序。

  4. 处理权限:确保你的应用有权限访问目标文件,并且目标应用有权限读取和处理该文件类型。

请注意,由于鸿蒙系统的API和机制可能与Android有所不同,因此你需要参考鸿蒙系统的官方文档来获取具体的API调用方式和参数。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部