HarmonyOS鸿蒙Next文件管理器中以我的应用打开文件的权限问题

HarmonyOS鸿蒙Next文件管理器中以我的应用打开文件的权限问题 我使用 module.json5声明了接收Want的skills标签,

"skills": [
  {
    "entities": [
      "entity.system.home"
    ],
    "actions": [
      "action.system.home",
      "ohos.want.action.viewData"
    ],
    "uris": [{
      "scheme": "file",
      "type": "general.jpeg",
      "linkFeature": "FileOpen"
    },{
      "scheme": "file",
      "type": "general.tiff",
      "linkFeature": "FileOpen"
    },{
      "scheme": "file",
      "type": "general.png",
      "linkFeature": "FileOpen"
    }]
  }
]

可以实现用文件管理器以我的应用打开图片,而我在EntryAbility的

onCreate(want: Want, _launchParam: AbilityConstant.LaunchParam): void {

从want中获取了文件的路径,但后续打开这个问题提示 No such file or directory,出现的问题应该是没有权限,但根据文档用文件管理器拉起我的应用并指定了文件应该是有权限的,我下断点 want 的权限参数里也有相应的值,但为何我的应用打开文件时就不可以呢。

开发环境:

DevEco Studio 6.01

"compatibleSdkVersion": "5.0.5(17)"

测试环境为 6.0.0 的模拟器和 5.1.0 的 MatePad 11.5s


更多关于HarmonyOS鸿蒙Next文件管理器中以我的应用打开文件的权限问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

鸿蒙Next文件管理器中以“我的应用”打开文件时,需要应用声明并申请对应的文件访问权限。应用需在module.json5配置文件中声明ohos.permission.READ_MEDIA等存储权限,并在运行时通过requestPermissionsFromUser动态申请用户授权。系统文件管理器将根据应用声明的权限和支持的文件类型(通过supportedMimeTypes配置)来匹配和显示可用的“我的应用”选项。用户首次选择应用打开文件时,系统会触发权限弹窗,授权后应用方可访问目标文件。

更多关于HarmonyOS鸿蒙Next文件管理器中以我的应用打开文件的权限问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,通过文件管理器拉起应用并传递文件路径时,应用默认不会自动获得该文件的访问权限。want参数中虽然包含了文件的URI,但直接使用该路径进行文件操作会因权限不足而失败。

关键点在于需要使用want中传递的URI,通过FileManager API来获取一个具有临时访问权限的文件描述符(FD)或路径。

在你的EntryAbilityonCreateonWindowStageCreate方法中,应该这样处理:

  1. want.uri中获取文件的URI字符串。
  2. 使用@ohos.file.fs@ohos.file.fileManager模块的API来安全地打开文件。

示例代码片段如下:

import fs from '@ohos.file.fs';
import fileManager from '@ohos.file.fileManager';
import common from '@ohos.app.ability.common';

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  let fileUri = want.uri; // 获取传递过来的文件URI
  if (fileUri) {
    // 使用FileManager获取临时授权访问
    let context = getContext(this) as common.UIAbilityContext;
    fileManager.getFile(context, fileUri).then((file: fileManager.File) => {
      // 通过file对象获取可访问的路径或文件描述符进行操作
      let fd = fs.openSync(file.path, fs.OpenMode.READ_ONLY);
      // ... 你的文件处理逻辑
      fs.closeSync(fd);
    }).catch((err: Error) => {
      console.error('Failed to get file with permission. Error: ' + JSON.stringify(err));
    });
  }
}

核心是调用fileManager.getFile()方法,系统会在此过程中完成权限的临时授予,返回的File对象包含了你的应用可以安全访问的路径。直接使用want.uri中的原始路径字符串是无效的。

此外,请确保你的应用在module.json5中声明了必要的文件访问权限(例如ohos.permission.READ_MEDIA),尽管通过此方式拉起时系统会动态授予临时权限,但基础声明仍是必须的。

回到顶部