HarmonyOS Next开发学习手册——选择用户文件

828 篇文章 5 订阅
376 篇文章 0 订阅

用户需要分享文件、保存图片、视频等用户文件时,开发者可以通过系统预置的 文件选择器(FilePicker) ,实现该能力。通过Picker访问相关文件,将拉起对应的应用,引导用户完成界面操作,接口本身无需申请权限。picker获取的uri只具有临时权限,获取持久化权限需要通过 FilePicker设置永久授权 方式获取。

根据用户文件的常见类型,选择器(FilePicker)分别提供以下选项:

  • PhotoViewPicker :适用于图片或视频类型文件的选择与保存(该接口在后续版本不再演进)。请使用 PhotoAccessHelper的PhotoViewPicker 来选择图片文件。请使用 安全控件创建媒体资源 。

  • DocumentViewPicker :适用于文件类型文件的选择与保存。DocumentViewPicker对接的选择资源来自于FilePicker, 负责文件类型的资源管理,文件类型不区分后缀,比如浏览器下载的图片、文档等,都属于文件类型。

  • AudioViewPicke :适用于音频类型文件的选择与保存。AudioViewPicker目前对接的选择资源来自于FilePicker。

选择图片或视频类文件

PhotoViewPicker 在后续版本不再演进,请使用 PhotoAccessHelper的PhotoViewPicker 来选择图片文件。

选择文档类文件

  1. 导入选择器模块和基础文件API模块。
import  { picker } from '@kit.CoreFileKit';
import { fileIo as fs } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
  1. 创建文件类型、文件选择选项实例。
const documentSelectOptions = new picker.DocumentSelectOptions();
// 选择文档的最大数目(可选)
documentSelectOptions.maxSelectNumber = 5;
// 指定选择的文件或者目录路径(可选)
documentSelectOptions.defaultFilePathUri = "file://docs/storage/Users/currentUser/test";
// 选择文件的后缀类型,若选择项存在多个后缀名,则每一个后缀名之间用英文逗号进行分隔(可选),后缀类型名不能超过100
documentSelectOptions.fileSuffixFilters = ['.png', '.txt', '.mp4'];
//选择是否对指定文件或目录授权,true为授权,当为true时,defaultFilePathUri为必选参数,拉起文管授权界面;false为非授权,拉起常规文管界面(可选)
documentSelectOptions.authMode = true;
  1. 创建 文件选择器DocumentViewPicker 实例。调用 select() 接口拉起FilePicker应用界面进行文件选择。
let uris: Array<string> = [];
let context = getContext(this) as common.Context; // 请确保 getContext(this) 返回结果为 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}`);
})

注意
1、使用picker获取的 select() 返回的uri权限是临时只读权限,待退出应用后台后,获取的临时权限就会失效。
2、如果想要获取持久化权限(仅在2in1设备上生效),请参考 文件持久化授权访问 。
3、开发者可以根据结果集中uri做进一步的处理。建议定义一个全局变量保存uri。
4、如有获取元数据需求,可以通过 基础文件API 和 文件URI 根据uri获取部分文件属性信息,比如文件大小、访问时间、修改时间、文件名、文件路径等。

  1. 待界面从FilePicker返回后,使用 基础文件API的fs.openSync 接口通过uri打开这个文件得到文件描述符(fd)。
let uri: string = '';
//这里需要注意接口权限参数是fs.OpenMode.READ_ONLY。
let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
console.info('file fd: ' + file.fd);
  1. 通过fd使用 fs.readSync 接口读取这个文件内的数据。
let buffer = new ArrayBuffer(4096);
let readLen = fs.readSync(file.fd, buffer);
console.info('readSync data to file succeed and buffer size is:' + readLen);
//读取完成后关闭fd。
fs.closeSync(file);

选择音频类文件

  1. 导入选择器模块和基础文件API模块。
import  { picker } from '@kit.CoreFileKit';
import { fileIo as fs } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';
  1. 创建音频类型文件选择选项实例。

说明
目前AudioSelectOptions不支持参数配置,默认可以选择所有类型的用户文件。

const audioSelectOptions = new picker.AudioSelectOptions();
  1. 创建 音频选择器AudioViewPicker 实例。调用 select() 接口拉起FilePicker应用界面进行文件选择。
let uri: string = '';
// 请确保 getContext(this) 返回结果为 UIAbilityContext
let context = getContext(this) as common.Context; 
const audioViewPicker = new picker.AudioViewPicker(context);
audioViewPicker.select(audioSelectOptions).then((audioSelectResult: Array<string>) => {
  //文件选择成功后,返回被选中音频的uri结果集。
  uri = audioSelectResult[0];
  console.info('audioViewPicker.select to file succeed and uri is:' + uri);
}).catch((err: BusinessError) => {
  console.error(`Invoke audioViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
})

注意

1、使用picker获取的 select() 返回的uri权限是临时只读权限,待退出应用后台后,获取的临时权限就会失效。

2、如果想要获取持久化权限(仅在2in1设备上生效),请参考 文件持久化授权访问 。

3、开发者可以根据结果集中的uri做读取文件数据操作。建议定义一个全局变量保存uri。例如通过 基础文件API 根据uri拿到音频资源的文件描述符(fd),再配合媒体服务实现音频播放的开发,具体请参考 音频播放开发指导 。

  1. 待界面从FilePicker返回后,可以使用 基础文件API的fs.openSync 接口通过uri打开这个文件得到文件描述符(fd)。
let uri: string = '';
//这里需要注意接口权限参数是fs.OpenMode.READ_ONLY。
let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
console.info('file fd: ' + file.fd);
  1. 通过fd可以使用 基础文件API的fs.readSync 接口读取这个文件内的数据。
let buffer = new ArrayBuffer(4096);
let readLen = fs.readSync(file.fd, buffer);
console.info('readSync data to file succeed and buffer size is:' + readLen);
//读取完成后关闭fd。
fs.closeSync(file);

鸿蒙全栈开发全新学习指南

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以要有一份实用的鸿蒙(HarmonyOS NEXT)学习路线与学习文档用来跟着学习是非常有必要的。

针对一些列因素,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

本路线共分为四个阶段

第一阶段:鸿蒙初中级开发必备技能

在这里插入图片描述

第二阶段:鸿蒙南北双向高工技能基础:gitee.com/MNxiaona/733GH

第三阶段:应用开发中高级就业技术

第四阶段:全网首发-工业级南向设备开发就业技术:gitee.com/MNxiaona/733GH

《鸿蒙 (Harmony OS)开发学习手册》(共计892页)

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

开发基础知识:gitee.com/MNxiaona/733GH

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

鸿蒙开发面试真题(含参考答案):gitee.com/MNxiaona/733GH

鸿蒙入门教学视频:

美团APP实战开发教学:gitee.com/MNxiaona/733GH

写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:gitee.com/MNxiaona/733GH

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值