概述
文件所有者为登录到该终端设备的用户,包括用户私有的图片、视频、音频、文档等。
应用对用户文件的创建、访问、删除等行为,需要提前获取用户授权,或由用户操作完成。
用户文件访问框架
是一套提供给开发者访问和管理用户文件的基础框架。
文件路径Uri
分为文档类Uri和媒体文件Uri两类,需要是normal等级的应用(默认的应用是这个)调用这两个类,要不然会报没有权限的错误,官方配图如下:
- 文档类:由picker拉起文件管理器选择或保存返回,以及通过fileAccess模块获取Uri。
- 媒体文件:由picker通过拉起图库选择图片或者视频返回,通过photoAccessHelper模块获取图片或者视频文件的uri,以及通过userFileManager模块获取图片、视频或者音频文件的uri。
文档类uri获取
- 通过DocumentViewPicker接口来选择和保存各种格式文档,返回选择或保存的文件的uri。
import { common } from '@kit.AbilityKit'; import { picker } from '@kit.CoreFileKit'; import { BusinessError } from '@kit.BasicServicesKit'; @Entry @Component struct Index { build() { Column(){ Button("点击文件选择器") .width("80%") .onClick((event: ClickEvent) => { let context = getContext(this) as common.Context; let docPicker = new picker.DocumentViewPicker(context); let opt = new picker.DocumentSelectOptions(); docPicker.select(opt,(err:BusinessError,selectResult:Array<string>)=>{ if (err) { console.error('错误: ' + JSON.stringify(err)); return; } console.info('选择文件的uri: ' + JSON.stringify(selectResult)); }) }) } .justifyContent(FlexAlign.Center) .height('100%') .width('100%') } }
- 通过AudioViewPicker接口来选择和保存音频类文件,返回选择或保存的文件的uri。
- 通过PhotoViewPicker.save方法保存文件,返回保存的文件Uri。
媒体类uri获取
- 通过PhotoViewPicker.select接口来选择图片/视频和保存图片/视频,返回选择的媒体文件文件的uri。
- 通过photoAccessHelper模块中的getAccess或createAccess接口获取媒体文件对应的uri。需要申请相册管理模块读权限'ohos.permission.READ_IMAGEVIDEO'。
用户选择图片并返回Uri案例
import { common } from '@kit.AbilityKit'; import { fileIo, picker } from '@kit.CoreFileKit'; import { BusinessError } from '@kit.BasicServicesKit'; import { photoAccessHelper } from '@kit.MediaLibraryKit'; @Entry @Component struct Index { @State _uris: Array<string> = []; /** * 选择图片 */ PickerImage(): void { //文档选择实例 const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions(); //选择文档的最大数目 photoSelectOptions.maxSelectNumber = 2; //过滤选择媒体文件类型为图片 photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; const photoViewPicker = new photoAccessHelper.PhotoViewPicker(); photoViewPicker.select(photoSelectOptions).then((selectResult: photoAccessHelper.PhotoSelectResult) => { this._uris = selectResult.photoUris; console.info('选择的文件路径:' + this._uris); }) .catch((err: BusinessError) => { console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`) }) } /** * 读取图片信息 */ ReadImageFileIo(): void { this._uris.forEach(uri => { let file = fileIo.openSync(uri, fileIo.OpenMode.READ_ONLY); let buffer = new ArrayBuffer(4096); let readLen = fileIo.readSync(file.fd, buffer); console.info('readSync data to file succeed and buffer size is:' + readLen); fileIo.closeSync(file); }); } build() { Column() { Button("点击文件选择器") .width("80%") .onClick((event: ClickEvent) => { let context = getContext(this) as common.Context; let docPicker = new picker.DocumentViewPicker(context); let opt = new picker.DocumentSelectOptions(); docPicker.select(opt, (err: BusinessError, selectResult: Array<string>) => { if (err) { console.error('错误: ' + JSON.stringify(err)); return; } console.info('选择文件的uri: ' + JSON.stringify(selectResult)); }) }) Button("点击图片选择器") .width("80%") .margin({ top: 20 }) .onClick(() => this.PickerImage()) if (this._uris != undefined && this._uris.length > 0) { Image(this._uris[0]) .width(50) .height(50) .margin({ top: 20 }) } } .justifyContent(FlexAlign.Center) .height('100%') .width('100%') } }