在从网络下载文件到本地、或将已有用户文件另存为新的文件路径等场景下,需要使用FilePicker提供的保存用户文件的能力。picker获取的uri只具有临时权限,获取持久化权限需要通过 FilePicker设置永久授权 方式获取。
对音频、图片、视频、文档类文件的保存操作类似,均通过调用对应picker的save()接口并传入对应的saveOptions来实现。通过Picker访问相关文件,无需申请权限。
当前所有picker的save接口都是用户可感知的,具体行为是拉起FilePicker, 将文件保存在系统文件管理器管理的特定目录,与图库管理的资源隔离,无法在图库中看到。
如需要在图库中看到所保存的图片、视频资源,请使用用户无感的 安全控件创建媒体资源 。
保存图片或视频类文件
PhotoViewPicker 在后续版本不再演进,请使用 安全控件创建媒体资源 。
保存文档类文件
- 导入选择器模块和基础文件API模块。
import { picker } from '@kit.CoreFileKit';
import { fileIo as fs } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';
- 创建文档保存选项实例。
// 创建文件管理器选项实例
const documentSaveOptions = new picker.DocumentSaveOptions();
// 保存文件名(可选)
documentSaveOptions.newFileNames = ["DocumentViewPicker01.txt"];
// 保存文件类型(可选)
documentSaveOptions.fileSuffixChoices = ['.png', '.txt', '.mp4'];
- 创建 文件选择器DocumentViewPicker 实例。调用 save() 接口拉起FilePicker界面进行文件保存。
let uris: Array<string> = [];
// 请确保 getContext(this) 返回结果为 UIAbilityContext
let context = getContext(this) as common.Context;
// 创建文件选择器实例。
const documentViewPicker = new picker.DocumentViewPicker(context);
//用户选择目标文件夹,用户选择与文件类型相对应的文件夹,即可完成文件保存操作。保存成功后,返回保存文档的uri。
documentViewPicker.save(documentSaveOptions).then((documentSaveResult: Array<string>) => {
uris = documentSaveResult;
console.info('documentViewPicker.save to file succeed and uris are:' + uris);
}).catch((err: BusinessError) => {
console.error(`Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
})
注意
1、不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存URI。
2、使用picker的 save() 接口获取到URI的权限是临时读写权限,待退出应用后台后,获取的临时权限就会失效。
3、如果想要获取持久化权限(仅在2in1设备上生效)