媒体文件操作是实际的业务场景中比较常用的操作,通常我们需要用户上传文件,然后对文件进行操作后,再上传服务器。本篇文章对HarmonyOS中对文件的获取以及基本操作进行说明。
设置媒体权限
在操作媒体文件之前需要在module.josn5
文件中配置对应的权限才能进行操作
{
"requestPermissions": [
{
"name": "ohos.permission.READ_IMAGEVIDEO",
"reason": "$string:app_name",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
},
},{
"name":'ohos.permission.WRITE_IMAGEVIDEO',
"reason":"$string:app_name",
"usedScene":{
"abilities":["EntryAbility"],
"when":"inuse"
}
}
]
}
获取媒体文件
HarmonyOS提供了多种获取媒体文件的方式,可以根据业务场景自行选择。
获取系统的所有媒体资源
获取所有媒体资源可以使用PhotoAccessHelper API实现。
获取资源的流程如下
- 创建photoAccessHelper实例对象
- 调用phtotAccessHelper的getAssets方法
// 导入PhotoAccessHelper模块
import photoAccessHelper from '@ohos.file.photoAccessHelper';
import dataSharePredicates from '@ohos.data.dataSharePredicates';
@Component
export default struct Asset{
fetchColumns: photoAccessHelper.PhotoKeys[] = [
photoAccessHelper.PhotoKeys.DATE_ADDED,
photoAccessHelper.PhotoKeys.SIZE
]
@State list:List[] = [];
async aboutToAppear(): Promise<void> {
const list = await this.getScreenShotList()
}
// 获取所有媒体资源
async getAssets() {
const photoAccess = this.getPhotoAccessHelper();
const fetchResult = await photoAccess.getAssets({
fetchColumns: this.fetchColumns,
predicates: new dataSharePredicates.DataSharePredicates()
});
const photoAssets = await fetchResult.getAllObjects();
return photoAssets
}
// 获取截图列表
async getScreenShotList() {
const list = await this.getAssets()
return list.filter(item => item.displayName.includes('screenshot'))
}
// 获取PhotoAccessHelper
getPhotoAccessHelper() {
return photoAccessHelper.getPhotoAccessHelper(getContext())
}
// 获取视频列表
async getVideoList() {
const list = await this.getAssets()
return list.filter(item => item.photoType === photoAccessHelper.PhotoType.VIDEO)
}
// 获取大尺寸图片
async getLargeList(){
const list = await this.getAssets();
return list.filter((item)=>{
return item.get(photoAccessHelper.PhotoKeys.SIZE) >= 200 * 1000
})
}
build() {}
}
通过用户上传文件
通过用户上传文件可以通过PhotoAccessHelper模块的PhotoViewPicker实例对象通过手动的方式打开文件选择界面,也可以通过PhotoPicker组件的方式自动打开文件选择界面。
我们以PhotoPicker为例
import {
PhotoPickerComponent,
PickerController,
PickerOptions
} from '@ohos.file.PhotoPickerComponent';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
@Component
struct PhotoPicker{
@State selectedUri:string[] = []
@State pickerOptions:PickerOptions = new PickerOptions()
aboutToAppear(){
// 初始化pickerOptions
// 设置最大选择数量
this.pickerOptions.maxSelectNumber= 5;
// 设置显示的可选择的文件类型
this.pickerOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_VIDEO_TYPE
}
build(){
PhotoPickerComponent(pickerOptions:this.pickerOptions,
onSelect:(uri:string)=>{
// 用户选择文件后的回调
this.selectedUri.push(uri);
}
onDeselect:(uri:string)=>{
// 用户取消选择的回调
this.selectedUri= this.selectedUri.filter((item:string)=> item !== uri)
}
)
}
}
压缩图片
获取图片之后,我们可以对图片进行一些操作,例如压缩、转换图片格式等。压缩图片使用的是Image模块,使用Image模块的imagePacker进行压缩。
压缩包图片的基本,流程如下
- 获取资源
- 创建imagePacker
- 创建imageSource
- 调用imagePacker的packing方法,进行压缩
- 把压缩后的文件写入文件系统
- 删除原文件
// 压缩图片
async compressFile(uri:string){
const imagePacker = image.createImagePacker();
const file = fileIo.openSync(uri)
const imageSource = image.createImageSource(file.fd)
const arraybuffer = await imagePacker.packing(imageSource,{format:'image/jpeg',quality:20})
const phAccessHelper = this.getPhotoAccessHelper();
const createAssetUri = await phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE,'jpg');
const fd = fileIo.openSync(createAssetUri,fileIo.OpenMode.READ_WRITE);
fileIo.writeSync(fd.fd,arraybuffer)
fileIo.close(fd.fd);
}
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » HarmonyOS媒体文件操作
发表评论 取消回复