首页 > 其他分享 >HarmonyOS应用开发实战 - Api9 拍照、拍视频、选择图片、选择视频、选择文件工具类

HarmonyOS应用开发实战 - Api9 拍照、拍视频、选择图片、选择视频、选择文件工具类

时间:2024-03-19 16:59:08浏览次数:12  
标签:视频 return Log mediaBean Api9 uri 选择 TAG let

鸿蒙开发过程中,经常会进行系统调用,拍照、拍视频、选择图库图片、选择图库视频、选择文件。今天就给大家分享一个工具类。

1.话不多说,先展示样式

在这里插入图片描述

2.设计思路

根据官方提供的指南开发工具类,基础的拍照、拍视频、图库选照片、选文件不过多缀述,图库选择这里设计成集合形式,可返回图片和视频,视频展示时不显示内容,所以在工具类多加了一个获取视频缩略图的功能。

3.具体代码

import common from '@ohos.app.ability.common';
import picker from '@ohos.file.picker';
import mediaLibrary from '@ohos.multimedia.mediaLibrary';
import wantConstant from '@ohos.ability.wantConstant';
import { MediaBean } from '../bean/MediaBean';
import { StringUtils } from '../utils/StringUtils';

/**
 * @description 多媒体辅助类
 * @author Gwei
 * @time 2024/3/1 15:57
 */
export class MediaHelper {
  private readonly TAG: string = 'MediaHelper';

  private mContext: common.Context;

  constructor(context: common.Context) {
    this.mContext = context;
  }

  /**
   * 图库选择,返回最大数量为9的图片、视频集合
   */
  public selectPicture(count:number): Promise<Array<MediaBean>> {

    let imgList:Array<string> = [];
    let mediaList:Array<MediaBean> = [];
    try {
      let photoSelectOptions = new picker.PhotoSelectOptions();
      photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
      photoSelectOptions.maxSelectNumber = 9-count;
      let photoPicker = new picker.PhotoViewPicker();
      return photoPicker.select(photoSelectOptions)
        .then((photoSelectResult) => {
          //Log.info(this.TAG, 'PhotoViewPicker.select successfully, PhotoSelectResult uri: ' + JSON.stringify(photoSelectResult));

          if (photoSelectResult && photoSelectResult.photoUris && photoSelectResult.photoUris.length > 0) {

            for (let i = 0; i < photoSelectResult.photoUris.length; i++) {
              imgList.push(photoSelectResult.photoUris[i]);
            }
            //Log.info(this.TAG, 'PhotoViewPicker.select successfully, PhotoSelectResult uri: ' + filePath);
            return imgList;
          }

        }).catch((err) => {
          //Log.error(this.TAG, 'PhotoViewPicker.select failed with err: ' + err);
          return err;
        }).then(async (imgList) => {
          for (let index = 0; index < imgList.length; index++) {
            const mediaBean = await this.buildMediaBean(imgList[index]);
            mediaList.push(mediaBean);
          }
          return mediaList;
        });
    } catch (err) {
      //Log.error(this.TAG, 'PhotoViewPicker failed with err: ' + err);
      return Promise.reject(err);
    }
  }

  /**
   * 选择文件
   */
  public selectFile(): Promise<MediaBean> {
    try {
      let documentSelectOptions = new picker.DocumentSelectOptions();
      let documentPicker = new picker.DocumentViewPicker();
      return documentPicker.select(documentSelectOptions)
        .then((documentSelectResult) => {
          //Log.info(this.TAG, 'DocumentViewPicker.select successfully, DocumentSelectResult uri: ' + JSON.stringify(documentSelectResult));

          if (documentSelectResult && documentSelectResult.length > 0) {
            let filePath = documentSelectResult[0];
            //Log.info(this.TAG, 'DocumentViewPicker.select successfully, DocumentSelectResult uri: ' + filePath);
            return filePath;
          }

        }).catch((err) => {
          //Log.error(this.TAG, 'PhotoViewPicker.select failed with err: ' + err);
          return err;
        }).then(async (filePath) => {

          const mediaBean = await this.buildMediaBean(filePath);
          return mediaBean;

        });
    } catch (err) {
      //Log.error(this.TAG, 'PhotoViewPicker failed with err: ' + err);
      return Promise.reject(err);
    }
  }


  /**
   * 拍照
   */
  public async takePhoto(context: common.UIAbilityContext): Promise<MediaBean> {


    let want = {
      'uri': '',
      'action': wantConstant.Action.ACTION_IMAGE_CAPTURE,
      'parameters': {},
    };
    return context.startAbilityForResult(want)
      .then((result) => {
        //Log.info(this.TAG, `startAbility call back , ${JSON.stringify(result)}`);
        if (result.resultCode === 0 && result.want && StringUtils.isNotNullOrEmpty(result.want.uri)) {
          //拍照成功
          //Log.info(this.TAG, 'takePhoto successfully, takePhotoResult uri: ' + result.want.uri);
          return result.want.uri;
        }
      }).catch((error) => {
        //Log.info(this.TAG, `startAbility error , ${JSON.stringify(error)}`);
        return error;
      }).then(async (uri: string) => {
        const mediaBean = await this.buildMediaBean(uri);
        return mediaBean;
      });
  }

  /**
   * 拍视频
   */
  public async takeVideo(context: common.UIAbilityContext): Promise<MediaBean> {


    let want = {
      'uri': '',
      'action': wantConstant.Action.ACTION_VIDEO_CAPTURE,
      'parameters': {},
    };
    return context.startAbilityForResult(want)
      .then((result) => {
        //Log.info(this.TAG, `startAbility call back , ${JSON.stringify(result)}`);
        if (result.resultCode === 0 && result.want && StringUtils.isNotNullOrEmpty(result.want.uri)) {
          //拍照成功
          //Log.info(this.TAG, 'takePhoto successfully, takePhotoResult uri: ' + result.want.uri);
          return result.want.uri;
        }
      }).catch((error) => {
        //Log.info(this.TAG, `startAbility error , ${JSON.stringify(error)}`);
        return error;
      }).then(async (uri: string) => {
        const mediaBean = await this.buildMediaBean(uri);
        return mediaBean;
      });
  }


  /**
   * 封装多媒体实体类
   *
   * @param uri 文件路径
   */
  private async buildMediaBean(uri: string): Promise<MediaBean> {

    if (StringUtils.isNullOrEmpty(uri)) {
      return null;
    }

    const mediaBean: MediaBean = new MediaBean();
    mediaBean.localUrl = uri;
    await this.appendFileInfoToMediaBean(mediaBean, uri);
    return mediaBean;
  }

  /**
   * 通过Uri查找所选文件信息,插入到MediaBean中
   * @param mediaBean
   * @param uri
   */
  private async appendFileInfoToMediaBean(mediaBean: MediaBean, uri: string):Promise<MediaBean> {

    if (StringUtils.isNullOrEmpty(uri)) {
      return;
    }
    let fileList: Array<mediaLibrary.FileAsset> = [];

    const parts: string[] = uri.split('/');
    const id: string = parts.length > 0 ? parts[parts.length - 1] : '-1';

    try {

      let media = mediaLibrary.getMediaLibrary(this.mContext);
      let mediaFetchOptions: mediaLibrary.MediaFetchOptions = {
        selections: mediaLibrary.FileKey.ID + '= ?',
        selectionArgs: [id],
        uri: uri
      };

      let fetchFileResult = await media.getFileAssets(mediaFetchOptions);
      //Log.info(this.TAG, `fileList getFileAssetsFromType fetchFileResult.count = ${fetchFileResult.getCount()}`);
      fileList = await fetchFileResult.getAllObject();
      fetchFileResult.close();
      await media.release();

    } catch (e) {
      //Log.error(this.TAG, "query: file data  exception ");
    }

    if (fileList && fileList.length > 0) {

      let fileInfoObj = fileList[0];
      //Log.info(this.TAG, `file id = ${JSON.stringify(fileInfoObj.id)} , uri = ${JSON.stringify(fileInfoObj.uri)}`);
      //Log.info(this.TAG, `file fileList displayName = ${fileInfoObj.displayName} ,size = ${fileInfoObj.size} ,mimeType = ${fileInfoObj.mimeType}`);

      mediaBean.fileName = fileInfoObj.displayName;
      mediaBean.fileSize = fileInfoObj.size;
      mediaBean.fileType = fileInfoObj.mimeType;
      mediaBean.pixelmap = await this.getPixelmap(fileInfoObj)
    }
  }

  /**
   * @description 获取缩略图
   * @author Gwei
   * @time 2024/3/1 15:57
   */
  getPixelmap(fileInfoObj) {
    return new Promise(function (resolve, reject) {
      fileInfoObj.getThumbnail((err, pixelmap) => {
        if (!err) {
          resolve(pixelmap)
        }else{
          resolve('');
        }
      })
    })
  }
}


4.使用方法

async handleClick(option: MediaOption) {
    let mediaBean: MediaBean;
    switch (option) {
      case MediaOption.TakePhoto:
        mediaBean = await this.mediaHelper.takePhoto(getContext() as common.UIAbilityContext);
        this.imgList.push(mediaBean)
        break;
      case MediaOption.TakeVideo:
        mediaBean = await this.mediaHelper.takeVideo(getContext() as common.UIAbilityContext);
        this.imgList.push(mediaBean)
        break;
      case MediaOption.Picture:
        let list: Array<MediaBean> = [];
        list = await this.mediaHelper.selectPicture(this.imgList.length);
        for (let i = 0; i < list.length; i++) {
          this.imgList.push(list[i])
        }
        break;
      case MediaOption.File:
        mediaBean = await this.mediaHelper.selectFile();
        this.audioList.push(mediaBean);
        break;
      default:
        break;
    }
}

工具类已经提供给大家了,喜欢的可以点赞收藏!!!

标签:视频,return,Log,mediaBean,Api9,uri,选择,TAG,let
From: https://blog.csdn.net/qq_34512796/article/details/136841103

相关文章

  • TSINGSEE青犀数字化、智能化视频技术推动森林防火智慧监管
    一、背景分析中央网络安全和信息化委员会印发《“十四五”国家信息化规划》,明确指出“提升林草生态网络感知能力,完善生态系统保护成效数字化监测评估体系”。这为数字化系统建设引领了方向,中国林业信息化建设迈入了新的阶段,全国各地相继推出数字林业发展规划。2020年,国家林业......
  • 前端基础之CSS选择器
    一、什么是选择器选择器是指通过一定的语法规则选取到对应的HTML标记,然后给这个对应的HTML标记设置样式二、选择器的分类CSS中提供了多种不同类型的选择器,例如基本选择器、组合选择器、伪类选择器、伪元素选择器等等。1、基本选择器(1)概览在CSS中,选择器用于选取HTML文档中的......
  • AI新工具 终于来了! 华丽的风格转移! ;基于视频/网络摄像头的 AI 运动捕捉应用,可用于虚拟
    ✨1:MagnificAI终于来了!......
  • 有没有好的视频素材无水印素材网站?
       寻找无字幕、清爽干净的无水印短视频素材确实挺费劲的,但幸好,还是有不少好地方能帮到我们。以下这几个网站,是我个人在制作短视频时经常光顾的宝藏网站,不仅资源丰富,而且素材清晰、无字幕,完全符合创作需求。1,首先得说的是蛙学府   说实话,这个网站你能想到的几乎......
  • 哪里有视频素材无水印免费下载?这几个无水印素材网看看
      追寻高质量的无水印短视频素材,无疑是让你的短视频作品充满梦幻与科幻感的绝佳方式。如果你正困于寻找那些能让人瞬间沉醉的优质素材,别担心,这里有几个资源丰富的网站可以帮助你1,首先推荐的是蛙学府   这个网站可以说是短视频素材的集大成者。无论是银河、星云还是......
  • Garnet发布 Redis不再是唯一选择
    Garnet是MicrosoftResearch的远程缓存存储,提供强大的性能(吞吐量和延迟)、可扩展性、存储、恢复、集群分片、密钥迁移和复制功能。Garnet可以与现有的Redis客户端配合使用。Garnet是MicrosoftResearch推出的一种新型远程缓存存储,具有多种独特优势:Garnet采用流行的......
  • 抖音无水印视频批量下载|视频爬虫采集工具
    抖音无水印视频批量下载神器,关键词搜索轻松获取您想要的视频!    随着抖音视频内容日益丰富,您是否常常希望能够批量下载您感兴趣的视频,但现有工具只支持单个链接提取,操作繁琐?别担心,q1977470120我们特别开发了一款强大的抖音视频批量下载工具,让您通过关键词搜索轻松获取......
  • element plus DateTimePicker控件选择日期不选时间,默认是0点,但是获取到的时间不一致
    只选择日期,未选择时间,应默认是0点 保存入库后时间变为16点 查看官方文档后,给控件设置这个属性即可value-format="YYYY-MM-DDHH:mm:ss" ......
  • 音视频技术的未来:即构、声网、腾讯云、网易云信2024年度对比
    ​引言随着2024年的到来,实时通讯(RTC)技术已成为推动数字经济发展的关键因素。从最基础的文本、音频和视频通信扩展到即时消息、文件共享、语音呼叫、直播互动以及视频会议等多元化功能,RTC技术在各个行业中的应用日益广泛。根据最新的市场研究,预计到2024年,中国实时音视频(RTC)PaaS市......
  • 前端学习-vue视频学习009-defineProps(子组件接收父组件的数据)
    尚硅谷视频链接defineProps-只接收父:要有数据letpersonList=reactive<personArr>([{id:'qqq1',name:'aaa',age:10,gender:'F'},{id:'qqq2',name:'vvv',age:30,gender:'F'},{id:'qq......