媒体文件操作是实际的业务场景中比较常用的操作,通常我们需要用户上传文件,然后对文件进行操作后,再上传服务器。本篇文章对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实现。
获取资源的流程如下

  1. 创建photoAccessHelper实例对象
  2. 调用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进行压缩。
压缩包图片的基本,流程如下

  1. 获取资源
  2. 创建imagePacker
  3. 创建imageSource
  4. 调用imagePacker的packing方法,进行压缩
  5. 把压缩后的文件写入文件系统
  6. 删除原文件
 // 压缩图片
  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);
  }

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部