首页 > 其他分享 >HarmonyOS NEXT开发实战教程:选择相册和拍照

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

时间:2024-11-03 08:49:15浏览次数:1  
标签:photoAccessHelper err 相册 NEXT HarmonyOS pickerResult error cameraPicker uris

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

 

图片

 

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

首先添加权限:

ohos.permission.CAMERA


ohos.permission.READ_IMAGEVIDEO

选择相册:​

async  getAlbum() {
    const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
    photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
    photoSelectOptions.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; // 过滤选择媒体文件类型为IMAGE
    photoSelectOptions.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})


  }
}

标签:photoAccessHelper,err,相册,NEXT,HarmonyOS,pickerResult,error,cameraPicker,uris
From: https://www.cnblogs.com/youlanjihua/p/18522881

相关文章

  • 开源全站第一个Nextron(NextJS+electron)项目--NextTalk:一款集成chatgpt的实时聊天工
    NextTalk简介该项目是一个基于Nextron(NextJS+Electron)的桌面端实时聊天工具。但由于使用了NextJS中的ssr及apiroute功能,该程序只能在开发环境运行。关于生产版本:我将其网页端部分分离,并用Pake将其打包成桌面端,生产体验安装包我放在了release里,目前只打包了windows版......
  • 移植 AWTK 到 纯血鸿蒙(HarmonyOS NEXT)系统 (0) - 序
    移植AWTK到纯血鸿蒙(HarmonyOSNEXT)系统(0)-序前段时间纯血鸿蒙系统HarmonyOS5.0(又称HarmonyOSNEXT)正式推出,这是继苹果iOS和安卓系统后,全球第三大移动操作系统。纯正国产操作系统登场,国人无不欢欣鼓舞,激动不已。HarmonyOS2.0时代我就尝试将AWTK移植到H......
  • 鸿蒙Next应用国际化:区域标识与文化差异
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在应用国际化中区域标识与文化习惯划分方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者......
  • 鸿蒙Next应用界面设计:国际化最佳实践
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在应用国际化界面设计方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在全球化的浪......
  • 鸿蒙Next应用全球化之路:国际化与本地化
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在应用国际化与本地化方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在当今全球化......
  • 鸿蒙Next应用国际化:语言与区域设置
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在应用国际化中语言与区域设置方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在当......
  • 高并发IPC通信实现:HarmonyOS中的异步调用与多线程处理
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在当今的移动应用开发领域,高并发通信场......
  • HarmonyOS跨设备通信:多端协同的RPC数据传输实现
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在智能设备日益普及的今天,多设备协同工......
  • nextjs 实战开发1 Mercury 二级域名分发系统| 曲速引擎 Warp Drive
    开发目标开发一个免费的二级域名分发系统创建项目root@ubuntu:~/dev-nextjs/mercury_frontend#pnpmcreatenext-app@latest.版本:pnpm-v9.12.2版本:node-vv20.16.0版本:next15.0.2为了开发方便,我们要将脚手架的package.json进行修改,nextdev-H0.0.0.0-p80,这样当我们运......
  • HarmonyOS:应用隐私保护
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18519104➤如果链接不是为敢技术的博客园地址,则可能是......