HarmonyOS鸿蒙Next中如何让用户选择访问文件目录?

HarmonyOS鸿蒙Next中如何让用户选择访问文件目录? 尝试使用下面代码来让用户选择目录,在鸿蒙PC上可以工作,但是在手机上不支持,系统版本是V6.0,请问是否有办法让用户在手机上选择目录(不是选择文件)来获得目录的访问权限?

let documentSelectOptions = new picker.DocumentSelectOptions();
documentSelectOptions.selectMode = picker.DocumentSelectMode.FOLDER;
5 回复

开发者你好,参考以下:如您意愿强烈麻烦请您提供以下信息给您走需求流程:"尊敬的开发者,您好!

请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在哪一个环节遇到了问题?另外请您说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。"

【常见FAQ】 Q:选择文件指定了文件夹模式为FOLDER,但手机上仍然无法选择文件夹只能选择文件,请问是什么原因? A:参考DocumentSelectMode,只支持设备PC/2in1|TV设备。

【背景知识】 DocumentViewPicker:文件选择器对象,用来支撑选择和保存各种格式文档。在使用前,需要先创建DocumentViewPicker实例。

DocumentSelectMode:DocumentViewPicker选择的文档类型,仅对PC/2in1TV设备生效,支持FOLDER文件夹类型。

【解决方案】 对于PC/2in1/TV设备可以通过DocumentSelectMode设置文件夹模式,选择整个文件夹;对于非PC/2in1/TV设备当前只能通过用户进行批量选择文件。

更多关于HarmonyOS鸿蒙Next中如何让用户选择访问文件目录?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


谢谢,我的目的是想选择目录,因为需要在这个目录创建新文件,所以想在手机上获取整个目录读取权限

let uris: string[] = [];
// 请在组件内获取context,确保this.getUIContext().getHostContext()返回结果为UIAbilityContext
let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
// 创建文件选择器实例
const documentViewPicker = new picker.DocumentViewPicker(context);
documentViewPicker.select(documentSelectOptions).then((documentSelectResult: Array<string>) => {
  //文件选择成功后,返回被选中文档的URI结果集。
  uris = documentSelectResult;
  console.info('documentViewPicker.select to file succeed and uris are:' + uris);
}).catch((err: BusinessError) => {
  console.error(`Invoke documentViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
})

参考地址

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/select-user-file

在HarmonyOS Next中,通过@ohos.file.fs模块的fs.access接口可检查文件目录访问权限,使用@ohos.file.picker模块的PhotoViewPickerDocumentViewPicker选择器让用户交互式选择文件目录。需在module.json5中声明ohos.permission.READ_IMAGEVIDEOohos.permission.READ_DOCUMENT权限。具体实现调用picker.select()方法触发系统文件选择器界面。

在HarmonyOS Next中,picker.DocumentSelectOptionsFOLDER 模式目前在手机设备上确实存在限制,这是出于系统安全和隐私保护的考虑。

对于手机设备,要获取目录的访问权限,推荐使用 FilePicker目录选择器(Directory Picker) 功能。这是当前在HarmonyOS Next手机端获取用户目录访问授权的标准方式。

核心步骤如下:

  1. 声明权限:在 module.json5 配置文件中声明必要的文件访问权限。

    "requestPermissions": [
      {
        "name": "ohos.permission.FILE_ACCESS_MANAGER"
      }
    ]
    
  2. 使用目录选择器:在代码中调用 FilePickerselect 方法,并指定 pickerMode 为目录模式。

    import { filePicker } from '@kit.FileKit';
    
    try {
      let options: filePicker.FileSelectOptions = {
        pickerMode: filePicker.PickerMode.DIR, // 关键:设置为目录选择模式
        // 可以添加其他过滤或配置选项
      };
      let uris = await filePicker.select(options);
      if (uris && uris.length > 0) {
        let selectedDirUri = uris[0];
        console.info('Selected directory URI:', selectedDirUri);
        // 现在你可以使用这个URI,通过fileIo或fileAccess接口来操作该目录
      }
    } catch (err) {
      console.error('Failed to select directory. Error:', err);
    }
    
  3. 处理返回的URI:选择成功后,你会获得一个代表该目录的URI(统一资源标识符)。你需要使用 fileAccessfileIo 等文件管理API,通过此URI来进一步读取或操作目录内的内容,而不是直接获取本地文件路径。

关键点说明:

  • 安全模型:HarmonyOS Next强化了安全沙箱机制。应用通过此方式获得的是对用户指定目录的受控访问权限,而非宽泛的文件系统访问。这更符合移动端的安全规范。
  • API差异:PC(如HarmonyOS for PC)与手机(HarmonyOS Next)在文件系统访问的API设计上存在差异,这是为了适配不同设备形态的安全需求和交互范式。手机端更强调通过明确的用户授权来访问特定目录。
  • 兼容性:请确保你使用的 FileKitFilePicker 等API版本与HarmonyOS Next SDK相匹配。

因此,解决你问题的方法是:在手机端放弃使用 DocumentSelectOptions,转而使用 FilePicker 的目录(DIR)选择模式。 这是当前在HarmonyOS Next手机设备上实现该功能的正确路径。

回到顶部