HarmonyOS NEXT实战:唤起相机

5 阅读2分钟

##HarmonyOS Next实战##HarmonyOS SDK应用服务##教育##

目标:可以唤起相机拍照和录像,并展示拍摄的图片和视频。

应用可调用CameraPicker拍摄照片或录制视频,无需申请相机权限。

  • CameraPicker的相机交互界面由系统提供,在用户点击拍摄和确认按钮后,调用CameraPicker的应用获取对应的照片或者视频。
  • 应用开发者如果只是需要获取即时拍摄的照片或者视频,则可以使用CameraPicker能力来轻松实现。
  • 由于照片的拍摄和确认都是由用户进行主动确认,因此应用开发者可以不用申请操作相机的相关权限。

cameraPicker.pick接口

pick(context: Context, mediaTypes: Array<PickerMediaType>, pickerProfile: PickerProfile): Promise<PickerResult>

拉起相机选择器,根据媒体类型进入相应的模式。操作结束通过Promise形式获取结果。

PickerProfile:相机选择器的配置信息。 PickerProfile属性

  • cameraPosition:相机的位置。
  • saveUri:保存配置信息的uri,默认值请参考文件uri。
  • videoDuration:录制的最大时长(单位:秒)。

说明

  • PickerProfile的saveUri为可选参数,如果未配置该项,拍摄的照片和视频默认存入媒体库中。
  • 如果不想将照片和视频存入媒体库,请自行配置应用沙箱内的文件路径。
  • 应用沙箱内的这个文件必须是一个存在的、可写的文件。这个文件的uri传入picker接口之后,相当于应用给系统相机授权该文件的读写权限。系统相机在拍摄结束之后,会对此文件进行覆盖写入。

PickerResult:相机选择器的处理结果。 PickerResult属性

  • resultCode:处理的结果,成功返回0,失败返回-1。
  • resultUri:返回的uri地址。若saveUri为空,resultUri为公共媒体路径。若saveUri不为空且具备写权限,resultUri与saveUri相同。若saveUri不为空且不具备写权限,则无法获取到resultUri。
  • mediaType:返回的媒体类型。

实战:CameraPickerPage

import { camera, cameraPicker as picker } from '@kit.CameraKit'
import { fileIo, fileUri } from '@kit.CoreFileKit'

@Entry
@Component
struct CameraPickerPage {
  @State imgSrc: string = '';
  @State videoSrc: string = '';
  @State isShowImage: boolean = false

  build() {
    Column({ space: 10 }) {
      Text('CameraPicker Demo')

      Row({ space: 10 }){
        Button('拍照')
          .onClick(async () => {
            let pathDir = getContext().filesDir;
            let fileName = `${new Date().getTime()}`
            let filePath = pathDir + `/${fileName}.tmp`
            fileIo.createRandomAccessFileSync(filePath, fileIo.OpenMode.CREATE);

            let uri = fileUri.getUriFromPath(filePath);
            let pickerProfile: picker.PickerProfile = {
              cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK,
              saveUri: uri
            };
            let result: picker.PickerResult =
              await picker.pick(getContext(), [picker.PickerMediaType.PHOTO],
                pickerProfile);
            console.info(`picker resultCode: ${result.resultCode},resultUri: ${result.resultUri},mediaType: ${result.mediaType}`);
            if (result.resultCode == 0) {
              if (result.mediaType === picker.PickerMediaType.PHOTO) {
                this.imgSrc = result.resultUri;
                this.isShowImage = true
              } else {
                this.videoSrc = result.resultUri;
              }
            }
          })

        Button('录视频')
          .onClick(async () => {
            let pathDir = getContext().filesDir;
            let fileName = `${new Date().getTime()}`
            let filePath = pathDir + `/${fileName}.tmp`
            fileIo.createRandomAccessFileSync(filePath, fileIo.OpenMode.CREATE);

            let uri = fileUri.getUriFromPath(filePath);
            let pickerProfile: picker.PickerProfile = {
              cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK,
              saveUri: uri
            };
            let result: picker.PickerResult =
              await picker.pick(getContext(), [ picker.PickerMediaType.VIDEO],
                pickerProfile);
            console.info(`picker resultCode: ${result.resultCode},resultUri: ${result.resultUri},mediaType: ${result.mediaType}`);
            if (result.resultCode == 0) {
              if (result.mediaType === picker.PickerMediaType.PHOTO) {
                this.imgSrc = result.resultUri;
              } else {
                this.videoSrc = result.resultUri;
                this.isShowImage = false
              }
            }
          })
      }

      if (this.imgSrc != '' || this.videoSrc != '') {
        if (this.isShowImage) {
          Image(this.imgSrc).width(200).height(200).backgroundColor(Color.Black).margin(5);
        } else {
          Video({ src: this.videoSrc }).width(200).height(200).autoPlay(true);
        }
      }
    }
    .height('100%')
    .width('100%')
  }
}