0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙APP開(kāi)發(fā)實(shí)戰(zhàn):【Api9】拍照、拍視頻;選擇圖片、視頻、文件工具類

jf_46214456 ? 來(lái)源:jf_46214456 ? 作者:jf_46214456 ? 2024-03-26 16:27 ? 次閱讀

鴻蒙開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)進(jìn)行系統(tǒng)調(diào)用,拍照、拍視頻、選擇圖庫(kù)圖片、選擇圖庫(kù)視頻、選擇文件。今天就給大家分享一個(gè)工具類。

1.話不多說(shuō),先展示樣式

1710837728088.gif

2.設(shè)計(jì)思路

根據(jù)官方提供的指南開(kāi)發(fā)工具類,基礎(chǔ)的拍照、拍視頻、圖庫(kù)選照片、選文件不過(guò)多綴述,圖庫(kù)選擇這里設(shè)計(jì)成集合形式,可返回圖片和視頻,視頻展示時(shí)不顯示內(nèi)容,所以在工具類多加了一個(gè)獲取視頻縮略圖的功能。


![搜狗高速瀏覽器截圖20240326151450.png](//file1.elecfans.com/web2/M00/C5/D1/wKgZomYChGOAUaiiAADe1d8SeRY102.jpg)

**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;
}

/**

  • 圖庫(kù)選擇,返回最大數(shù)量為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;
  });

}

/**

  • 封裝多媒體實(shí)體類
  • @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;

}

/**

  • 通過(guò)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;
}
}


工具類已經(jīng)提供給大家了,希望能幫助到大家?。?!

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 鴻蒙
    +關(guān)注

    關(guān)注

    56

    文章

    2267

    瀏覽量

    42482
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙實(shí)戰(zhàn)項(xiàng)目開(kāi)發(fā):【短信服務(wù)】

    的道路上更進(jìn)一步。 《鴻蒙 (OpenHarmony)開(kāi)發(fā)學(xué)習(xí)視頻》 ? 《鴻蒙生態(tài)應(yīng)用開(kāi)發(fā)V2.0白皮書(shū)》 《
    發(fā)表于 03-03 21:29

    鴻蒙原生應(yīng)用元服務(wù)開(kāi)發(fā)-鴻蒙真機(jī)運(yùn)行項(xiàng)目實(shí)戰(zhàn)與注意事項(xiàng)

    、查看設(shè)備運(yùn)行 五、點(diǎn)擊項(xiàng)目結(jié)構(gòu) 六、勾選紅色框圈部分 登錄開(kāi)發(fā)者賬號(hào) 七、選擇好公司 八、等待運(yùn)行完成 九、安裝成功 可以在真機(jī)上體驗(yàn)項(xiàng)目了 本文參考引用HarmonyOS官方開(kāi)發(fā)文檔,基于
    發(fā)表于 05-24 15:12

    以無(wú)線藍(lán)牙小車為載體的視頻/圖片監(jiān)

    項(xiàng)目名稱:以無(wú)線藍(lán)牙小車為載體的視頻/圖片監(jiān)車項(xiàng)目說(shuō)明:(一)該“無(wú)線藍(lán)牙小車為載體的視頻/圖片監(jiān)
    發(fā)表于 10-24 18:25

    【ELF靈翼自拍無(wú)人機(jī)測(cè)評(píng)】之APP及航測(cè)試

    的。 最后來(lái)看看我們的攝像頭航效果,這里需要先點(diǎn)擊APP中央的視頻界面出,先連接好攝像頭,待出現(xiàn)影像后,然后點(diǎn)擊攝像機(jī)按鈕并控制油門方向,隨后便可以進(jìn)行航,當(dāng)然如果需要
    發(fā)表于 05-21 10:16

    HarmonyOS 開(kāi)發(fā)視頻展示(一)

    應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)》擼了個(gè)呼吸訓(xùn)練APP,并在AI camera 上運(yùn)行起來(lái),分享下一些注意點(diǎn)和目前遇到的問(wèn)題。4、【Raspberry Pi 2B小視頻參賽】+將
    發(fā)表于 03-04 11:22

    HarmonyOS 開(kāi)發(fā)視頻展示(三)

    原理圖,發(fā)現(xiàn)有個(gè)LED0是接在gpio2_3這個(gè)引腳上的,果斷選擇點(diǎn)亮這個(gè)燈。9、用鴻蒙開(kāi)發(fā)AI應(yīng)用(五)HDF 驅(qū)動(dòng)補(bǔ)光燈簡(jiǎn)介:上一篇,我們?cè)?b class='flag-5'>鴻蒙
    發(fā)表于 03-05 10:23

    【HarmonyOS】鴻蒙圖片加載工具匯總

    ,這些示例演示了該項(xiàng)目中的使用。最簡(jiǎn)單的方法是使用 GifImageView5、鴻蒙圖片加載工具——ionopenharmony Asynchronous Networking an
    發(fā)表于 03-25 13:51

    請(qǐng)問(wèn)如何選擇鴻蒙App開(kāi)發(fā)的編程語(yǔ)言?

    如何選擇鴻蒙App開(kāi)發(fā)的編程語(yǔ)言
    發(fā)表于 04-13 11:15

    OpenHarmony 應(yīng)用開(kāi)發(fā)SDK、API 與基礎(chǔ)工具

    一、整體說(shuō)明 ArkTS 語(yǔ)言是鴻蒙系統(tǒng)主推的應(yīng)用開(kāi)發(fā)語(yǔ)言。因此鴻蒙系統(tǒng)提供給開(kāi)發(fā)者的 API 絕大部分也是 ArkTS 語(yǔ)言的。
    發(fā)表于 09-19 15:45

    鴻蒙原生應(yīng)用/元服務(wù)開(kāi)發(fā)-AGC分發(fā)如何下載管理Profile

    Profile文件中已擴(kuò)展App ID信息;后續(xù)上架流程會(huì)檢測(cè)API9以上HarmonyOS應(yīng)用/元服務(wù)的Profile文件是否包含App
    發(fā)表于 11-29 15:10

    視頻監(jiān)控APP開(kāi)發(fā)公司

      深圳APP開(kāi)發(fā)公司【粉果科技】表示:智能安防攝像頭在現(xiàn)代生活中的運(yùn)用越來(lái)越廣泛,尤其在家庭安全方面,智能監(jiān)控更是不錯(cuò)的選擇,所以基于家庭安全的物聯(lián)網(wǎng)設(shè)備和智能設(shè)備遠(yuǎn)程控制APP逐漸
    發(fā)表于 06-13 11:55 ?327次閱讀

    微信小程序如何開(kāi)發(fā)?微信小程序教程視頻常用組件API開(kāi)發(fā)項(xiàng)目實(shí)戰(zhàn)

    本文檔的主要內(nèi)容介紹的是微信小程序如何開(kāi)發(fā)?微信小程序教程視頻微信小程序入門與實(shí)戰(zhàn) 常用組件API開(kāi)發(fā)技巧項(xiàng)目
    發(fā)表于 08-28 14:41 ?88次下載

    SDK 與API視頻環(huán)境中的區(qū)別

    現(xiàn)在,視頻API視頻SDK 不一定是每個(gè)工具本身的一個(gè)類別。相反,它們是創(chuàng)建的API 或SDK,旨在幫助您與并非從頭開(kāi)始構(gòu)建的
    發(fā)表于 11-25 09:34 ?543次閱讀

    鴻蒙開(kāi)發(fā)實(shí)戰(zhàn):【文件管理】

    ]?、[@ohos.file.fs]、[@ohos.app.ability.contextConstant] 等接口,實(shí)現(xiàn)了增添文件、刪除文件、查找指定類型文件
    的頭像 發(fā)表于 03-20 21:57 ?507次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b>:【<b class='flag-5'>文件</b>管理】

    基于ArkTS語(yǔ)言的OpenHarmony APP應(yīng)用開(kāi)發(fā):HelloOpenharmony

    1、程序簡(jiǎn)介該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫(xiě)的UI應(yīng)用:HelloOpenHarmony。本案例是基于API9接口開(kāi)發(fā)。本案例已在OpenHarmony凌蒙派-RK3568開(kāi)發(fā)
    的頭像 發(fā)表于 09-15 08:09 ?75次閱讀
    基于ArkTS語(yǔ)言的OpenHarmony <b class='flag-5'>APP</b>應(yīng)用<b class='flag-5'>開(kāi)發(fā)</b>:HelloOpenharmony