【HarmonyOS】鸿蒙应用获取用户设备内文件
问题背景: 应用访问用户设备内的文件(图片,视频,音频,文档文件,xx文件)等用户文件时,我们可以通过系统预置的文件选择器(FilePicker),实现该能力。
通过Picker访问相关文件,将拉起对应的应用,引导用户完成界面操作,接口本身无需申请权限。
但是picker获取的uri只具有临时权限,应用后台关闭后就失去了访问权限。
需要注意的是,官方API演进已经将图片和视频的访问,从FilePicker中移入到PhotoAccessHelper中,具体参见这篇文章:【HarmonyOS】鸿蒙中如何获取用户相册图片?photoAccessHelper.PhotoViewPicker
音频文件的访问,参见这篇文章:【HarmonyOS】鸿蒙应用获取用户设备内音频资源文件
Demo示例:
import { picker } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
/**
* 文件选择
*/
@Entry
@Component
struct FileSelectPage {
build() {
RelativeContainer() {
Text("点击唤起文件选择器")
.fontSize(px2fp(42))
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
.onClick(()=>{
const documentSelectOptions = new picker.DocumentSelectOptions();
// 选择文档的最大数目(可选)
documentSelectOptions.maxSelectNumber = 5;
// 指定选择的文件或者目录路径(可选)
documentSelectOptions.defaultFilePathUri = "file://docs/storage/Users/currentUser/test";
// 选择文件的后缀类型['后缀类型描述|后缀类型'](可选) 若选择项存在多个后缀名,则每一个后缀名之间用英文逗号进行分隔(可选),后缀类型名不能超过100,选择所有文件:'所有文件(*.*)|.*';
documentSelectOptions.fileSuffixFilters = ['图片(.png, .jpg)|.png,.jpg', '文档|.txt', '视频|.mp4', '.pdf'];
//选择是否对指定文件或目录授权,true为授权,当为true时,defaultFilePathUri为必选参数,拉起文管授权界面;false为非授权,拉起常规文管界面(可选)
documentSelectOptions.authMode = true;
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}`);
})
})
}
.height('100%')
.width('100%')
}
}