HarmonyOS NEXT开发实战教程:选择相册和拍照

news/2025/1/7 19:10:05/文章来源:https://www.cnblogs.com/youlanjihua/p/18522881

今天的内容是介绍在鸿蒙开发中从相册选择照片,和调用相机拍照,并使用这两个功能实现朋友圈编辑页面。

 

图片

 

这部分内容没什么好废话的,都是固定用法,直接上代码。

首先添加权限:

ohos.permission.CAMERAohos.permission.READ_IMAGEVIDEO

选择相册:​

async  getAlbum() {const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGEphotoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目let uris: Array<string> = [];const photoViewPicker = new photoAccessHelper.PhotoViewPicker();photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {uris = photoSelectResult.photoUris;uris.forEach(element => {this.photoList.push(element)});console.info('photoViewPicker.select to file succeed and uris are:' + uris);}).catch((err: BusinessError) => {console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);})}

调用相机:​

async invokeCamera(callback: (uri: string) => void) {try {let pickerProfile: cameraPicker.PickerProfile = {cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK};let pickerResult: cameraPicker.PickerResult = await cameraPicker.pick(getContext(),[cameraPicker.PickerMediaType.PHOTO, cameraPicker.PickerMediaType.VIDEO], pickerProfile);console.log("the pick pickerResult is:" + JSON.stringify(pickerResult));if (callback && pickerResult) {callback(pickerResult.resultUri);}} catch (error) {let err = error as BusinessError;console.error(`the pick call failed. error code: ${err.code}`);}}

整个页面完整代码如下:​

import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { cameraPicker } from '@kit.CameraKit';
import { camera } from '@kit.CameraKit';
import { AlertSheet } from './AlertSheet';@Entry
@Component
struct Index {@State photoList:string[] = []dialogController: CustomDialogController | null = new CustomDialogController({builder: AlertSheet({titles:['拍照','相册'],itemClick:(str)=>{switch (str){case '拍照':this.invokeCamera((url)=>{this.photoList.push(url)})break;case '相册':this.getAlbum()break;}}}),alignment: DialogAlignment.Bottom,offset: { dx: 0, dy: -25 }})async  getAlbum() {const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGEphotoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目let uris: Array<string> = [];const photoViewPicker = new photoAccessHelper.PhotoViewPicker();photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {uris = photoSelectResult.photoUris;uris.forEach(element => {this.photoList.push(element)});console.info('photoViewPicker.select to file succeed and uris are:' + uris);}).catch((err: BusinessError) => {console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);})}async invokeCamera(callback: (uri: string) => void) {try {let pickerProfile: cameraPicker.PickerProfile = {cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK};let pickerResult: cameraPicker.PickerResult = await cameraPicker.pick(getContext(),[cameraPicker.PickerMediaType.PHOTO, cameraPicker.PickerMediaType.VIDEO], pickerProfile);console.log("the pick pickerResult is:" + JSON.stringify(pickerResult));if (callback && pickerResult) {callback(pickerResult.resultUri);}} catch (error) {let err = error as BusinessError;console.error(`the pick call failed. error code: ${err.code}`);}}build() {Column(){TextArea({placeholder:'这一刻的想法'}).placeholderFont({size:16}).placeholderColor('rgb(188,188,188)').width('100%').height(100).backgroundColor(Color.White)Grid(){ForEach(this.photoList,(str:string,index)=>{GridItem(){Image(str).width(90).height(90)}})GridItem(){Image($r('app.media.add')).width(90).height(90).onClick(()=>{this.dialogController?.open()})}}.columnsGap(10).rowsGap(10).columnsTemplate('1fr 1fr 1fr 1fr')}.padding({left:15,right:15,top:40})}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/826021.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Veritas Enterprise Vault 15.1 (Windows) - 自动捕获数据并归档信息

Veritas Enterprise Vault 15.1 (Windows) - 自动捕获数据并归档信息Veritas Enterprise Vault 15.1 (Windows) - 自动捕获数据并归档信息 信息归档解决方案,确保合规与有效的信息治理 请访问原文链接:https://sysin.org/blog/veritas-enterprise-vault-15/ 查看最新版。原创…

鸿蒙开发案例:分贝仪

【1】引言(完整代码在最后面) 分贝仪是一个简单的应用,用于测量周围环境的噪音水平。通过麦克风采集音频数据,计算当前的分贝值,并在界面上实时显示。该应用不仅展示了鸿蒙系统的基础功能,还涉及到了权限管理、音频处理和UI设计等多个方面。 【2】环境准备 电脑系统:win…

读数据工程之道:设计和构建健壮的数据系统26数据建模

数据建模1. 数据建模 1.1. 良好的数据架构必须反映出使用这些数据的组织的业务目标和业务逻辑 1.2. 数据湖1.0、NoSQL和大数据系统的兴起,使工程师们有时是为了合理的性能提升去忽略传统的数据建模 1.3. 数据在企业中的地位急剧上升,人们越来越认识到,建模对于实现数据科学需…

Codeforces Round 984 div3 个人题解(A~F)

Codeforces Round 984 div3 个人题解(A~F) Dashboard - Codeforces Round 984 (Div. 3) - Codeforces 火车头 #define _CRT_SECURE_NO_WARNINGS 1#include <algorithm> #include <array> #include <bitset> #include <cassert> #include <cmath>…

生存目录-无层级

import pypdf# 输入和输出文件名 input_pdf_filename = file.pdf output_pdf_filename = file_with_toc.pdf csv_filename = output.csv# 创建一个PdfWriter实例 writer = pypdf.PdfWriter()# 读取原始PDF文件 with open(input_pdf_filename, "rb") as input_pdf:rea…

提取pdf文档的目录1.0

import fitz # PyMuPDF import pandas as pd# 打开PDF文件 pdf_path = 控制之美.pdf # 请确保替换为正确的文件路径 document = fitz.open(pdf_path)# 初始化一个列表来存储目录信息 toc_list = []# 提取目录信息的函数 def extract_toc(toc, level=0):for item in toc:# 确保…

Redis实现消息发布订阅

对于一些解耦异步行为,往往会使用到MQ消息,但是很多时候可能由于条件受限没有可使用的消息队列供我们使用,那么则可以使用Redis来实现简单的消息发布订阅。 很简单,只需要三个类即可实现。 /*** MQ频道主题配置*/ @Configuration public class RedisConfig {@BeanMessageLi…

TenSunS对接JumpServer:如何把主机自动同步到JumpServer

🦄概述后羿 - TenSunS(原ConsulManager)是一个使用Flask+Vue开发,基于Consul的WEB运维平台,弥补了Consul官方UI对Services管理的不足;并且基于Consul的服务发现与键值存储:实现了Prometheus自动发现多云厂商各资源信息;基于Blackbox对站点监控的可视化维护;以及对自建与…

不同阻尼比下的振动形式-代码

import numpy as np import matplotlib.pyplot as plt# 定义参数 zeta = 0.5 # 阻尼比 omega_n = 1.0 # 自然频率 omega_d = omega_n * np.sqrt(1 - zeta**2) # 阻尼频率 varphi = np.pi / 4 # 相位角# 定义时间变量 t = np.linspace(0, 10, 1000) # 从0到10秒,1000个点#…

TenSunS监控REDIS:使用一个redis_exporter监控所有的Redis实例

🦄概述后羿 - TenSunS(原ConsulManager)是一个使用Flask+Vue开发,基于Consul的WEB运维平台,弥补了Consul官方UI对Services管理的不足;并且基于Consul的服务发现与键值存储:实现了Prometheus自动发现多云厂商各资源信息;基于Blackbox对站点监控的可视化维护;以及对自建与…

TenSunS监控Mysql:如何优雅的使用一个mysqld_exporter监控所有的MySQL实例

🦄概述后羿 - TenSunS(原ConsulManager)是一个使用Flask+Vue开发,基于Consul的WEB运维平台,弥补了Consul官方UI对Services管理的不足;并且基于Consul的服务发现与键值存储:实现了Prometheus自动发现多云厂商各资源信息;基于Blackbox对站点监控的可视化维护;以及对自建与…