HarmonyOS 自定义相机功能?

想要实现相机录入功能,自定义相机样式,有对应的文档,示例或者demo吗?

阅读 595
1 个回答

官网文档中提供了相机开发的最佳实践,可参考该内容进行自定义相机的开发,参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/camera-shooting-case-V5

demo代码如下:

import { abilityAccessCtrl, PermissionRequestResult, Permissions } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import common from '@ohos.app.ability.common';
import camera from '@ohos.multimedia.camera';
@Entry
@Component
export struct CameraPage {
  @StorageProp('statusBarHeight') statusBarHeight: number = 0;
  private xcomponentController: XComponentController = new XComponentController;
  private surfaceId: string = '';
  requestCameraPermission(): void {
    let permission: Permissions[] = ['ohos.permission.CAMERA'];
    let context: Context = getContext(this) as Context;
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    atManager.requestPermissionsFromUser(context, permission).then((data: PermissionRequestResult) => {
      let grantStatus: Array<number> = data.authResults;
      let length: number = grantStatus.length;
      for (let i = 0; i < length; i++) {
        if (grantStatus[i] != 0) {
          // 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
          return;
        }
      }
      // 授权成功
    }).catch((err: BusinessError) => {
      console.error(`${err.code}:${err.message}`)
    })
  }
  async aboutToAppear(): Promise<void> {
    this.requestCameraPermission()
  }
  build() {
    Column() {
      Row() {
        XComponent({
          id: 'xcomponent',
          type: XComponentType.SURFACE,
          controller: this.xcomponentController
        })
          .onLoad(() => {
            this.xcomponentController.setXComponentSurfaceSize({ surfaceWidth: 1920, surfaceHeight: 1080 });
            this.surfaceId = this.xcomponentController.getXComponentSurfaceId()
          })
          .width('720px')
          .height('480px')
      }
      .backgroundColor(Color.Black)
      Button("开始预览")
        .onClick(() => {
          previewCamera(getContext(this), this.surfaceId);
        })
    }
  }
}
export async function previewCamera(baseContext: common.BaseContext, surfaceId: string): Promise<void> {
  //获取CameraManager
  let cameraManager: camera.CameraManager = camera.getCameraManager(baseContext);
  //获取相机列表
  let cameraArray: Array<camera.CameraDevice> = cameraManager.getSupportedCameras();
  //创建相机输入流
  let cameraInput: camera.CameraInput | undefined = undefined;
  try{
    cameraInput = cameraManager.createCameraInput(cameraArray[0]);
    cameraInput.on('error', cameraArray[0], (error: BusinessError) =>{
      console.error(`Camera input error code: ${error.code}`);
    });
    await cameraInput.open();
  } catch (e) {
    let error:BusinessError = e as BusinessError;
    console.error(`${error.code}:${error.message}`)
  }
  //获取相机设备支持的输出流能力
  let cameraOutputCap: camera.CameraOutputCapability = cameraManager.getSupportedOutputCapability(cameraArray[0]);
  let previewProfilesArray: Array<camera.Profile> = cameraOutputCap.previewProfiles;
  if (!previewProfilesArray) {
    console.error("cameraManager.getSupportedOutputCapability error");
    return undefined;
  }
  //创建预览输出流
  let previewOutput: camera.PreviewOutput | undefined = undefined;
  previewOutput = cameraManager.createPreviewOutput(previewProfilesArray[0], surfaceId);
  //创建会话
  let captureSession: camera.PhotoSession | undefined = undefined;
  captureSession = cameraManager.createSession(camera.SceneMode.NORMAL_PHOTO) as camera.PhotoSession;
  try {
    captureSession.beginConfig();
    captureSession.addInput(cameraInput);
    captureSession.addOutput(previewOutput);
    await captureSession.commitConfig();
    await captureSession.start();
  } catch (e) {
    let error: BusinessError = e as BusinessError;
    console.error(`${error.code}:${error.message}`)
  }
}

还需要在module.json5文件中声明如下权限:

{
  "name": "ohos.permission.CAMERA",
"usedScene": {
  "abilities": [
  "EntryAbility"
  ],
  "when": "inuse"
},
  "reason": "$string:reason"
},{
  "name": "ohos.permission.READ_IMAGEVIDEO",
  "usedScene": {
    "abilities": [
    "EntryAbility"
    ],
    "when": "inuse"
  },
  "reason": "$string:reason"
},{
  "name": "ohos.permission.WRITE_IMAGEVIDEO",
  "usedScene": {
    "abilities": [
    "EntryAbility"
    ],
    "when": "inuse"
  },
  "reason": "$string:reason"
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进