鴻蒙開發(fā)過程中,經(jīng)常會進行系統(tǒng)調(diào)用,拍照、拍視頻、選擇圖庫圖片、選擇圖庫視頻、選擇文件。今天就給大家分享一個工具類。
1.?話不多說,先展示樣式
2.設(shè)計思路
根據(jù)官方提供的指南開發(fā)工具類,基礎(chǔ)的拍照、拍視頻、圖庫選照片、選文件不過多綴述,圖庫選擇這里設(shè)計成集合形式,可返回圖片和視頻,視頻展示時不顯示內(nèi)容,所以在工具類多加了一個獲取視頻縮略圖的功能。
更多鴻蒙開發(fā)應(yīng)用知識已更新gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md參考前往。
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;
}
/**
* 圖庫選擇,返回最大數(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;
});
}
/**
* 封裝多媒體實體類
*
* @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;
}
}
工具類已經(jīng)提供給大家了,希望能幫助到大家?。?!
鴻蒙開發(fā)崗位需要掌握那些核心要領(lǐng)?
目前還有很多小伙伴不知道要學習哪些鴻蒙技術(shù)?不知道重點掌握哪些?為了避免學習時頻繁踩坑,最終浪費大量時間的。
自己學習時必須要有一份實用的鴻蒙(Harmony NEXT)資料非常有必要。 這里我推薦,根據(jù)鴻蒙開發(fā)官網(wǎng)梳理與華為內(nèi)部人員的分享總結(jié)出的開發(fā)文檔。內(nèi)容包含了:【ArkTS、ArkUI、Stage模型、多端部署、分布式應(yīng)用開發(fā)、音頻、視頻、WebGL、OpenHarmony多媒體技術(shù)、Napi組件、OpenHarmony內(nèi)核、Harmony南向開發(fā)、鴻蒙項目實戰(zhàn)】等技術(shù)知識點。
廢話就不多說了,接下來好好看下這份資料。
如果你是一名Android、Java、前端等等開發(fā)人員,想要轉(zhuǎn)入鴻蒙方向發(fā)展??梢灾苯宇I(lǐng)取這份資料輔助你的學習。鴻蒙OpenHarmony知識←前往。下面是鴻蒙開發(fā)的學習路線圖。
針對鴻蒙成長路線打造的鴻蒙學習文檔。鴻蒙(OpenHarmony )學習手冊(共計1236頁)與鴻蒙(OpenHarmony )開發(fā)入門教學視頻,幫助大家在技術(shù)的道路上更進一步。
其中內(nèi)容包含:
《鴻蒙開發(fā)基礎(chǔ)》鴻蒙OpenHarmony知識←前往
- ArkTS語言
- 安裝DevEco Studio
- 運用你的第一個ArkTS應(yīng)用
- ArkUI聲明式UI開發(fā)
- .……
《鴻蒙開發(fā)進階》鴻蒙OpenHarmony知識←前往
- Stage模型入門
- 網(wǎng)絡(luò)管理
- 數(shù)據(jù)管理
- 電話服務(wù)
- 分布式應(yīng)用開發(fā)
- 通知與窗口管理
- 多媒體技術(shù)
- 安全技能
- 任務(wù)管理
- WebGL
- 國際化開發(fā)
- 應(yīng)用測試
- DFX面向未來設(shè)計
- 鴻蒙系統(tǒng)移植和裁剪定制
- ……
《鴻蒙開發(fā)實戰(zhàn)》鴻蒙OpenHarmony知識←前往文章來源:http://www.zghlxwxcb.cn/news/detail-855538.html
- ArkTS實踐
- UIAbility應(yīng)用
- 網(wǎng)絡(luò)案例
- ……
最后
鴻蒙是完全具備無與倫比的機遇和潛力的;預(yù)計到年底將有 5,000 款的應(yīng)用完成原生鴻蒙開發(fā),這么多的應(yīng)用需要開發(fā),也就意味著需要有更多的鴻蒙人才。鴻蒙開發(fā)工程師也將會迎來爆發(fā)式的增長,學習鴻蒙勢在必行!文章來源地址http://www.zghlxwxcb.cn/news/detail-855538.html
到了這里,關(guān)于鴻蒙APP開發(fā)實戰(zhàn):【Api9】拍照、拍視頻;選擇圖片、視頻、文件工具類的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!