HarmonyOS下Camera相机相关API使用
准备工作
1. 导入camera接口
import { camera } from '@kit.CameraKit' ;
import { BusinessError } from '@kit.BasicServicesKit' ;
import { common } from '@kit.AbilityKit' ;
2.获取cameraManager对象
getCameraManager ( ) : camera. CameraManager {
let cameraManager: camera. CameraManager = camera. getCameraManager ( getContext ( this ) ) ;
console. error ( "01 cameraManager." + cameraManager) ;
return cameraManager;
}
3.通过cameraManager类中的getSupportedCameras方法
getCameraDevices ( cameraManager: camera. CameraManager) : Array< camera. CameraDevice> {
let cameraArray: Array< camera. CameraDevice> = cameraManager. getSupportedCameras ( ) ;
this . showContent = ''
if ( cameraArray != undefined && cameraArray. length > 0 ) {
this . showContent = '支持的相机设备数量:' + cameraArray. length
for ( let index = 0 ; index < cameraArray. length; index++ ) {
console. info ( 'cameraId : ' + cameraArray[ index] . cameraId) ;
console. info ( 'cameraPosition : ' + cameraArray[ index] . cameraPosition) ;
console. info ( 'cameraType : ' + cameraArray[ index] . cameraType) ;
console. info ( 'connectionType : ' + cameraArray[ index] . connectionType) ;
this . showContent = 'cameraId:' + cameraArray[ index] . cameraId + '|cameraType:' + cameraArray[ index] . cameraType + '|connectionType:' + cameraArray[ index] . connectionType
}
return cameraArray;
} else {
console. error ( "cameraManager.getSupportedCameras error" ) ;
this . errorContent = ' cameraManager.getSupportedCameras error'
return [ ] ;
}
}
4.创建相机输入流
createInput ( cameraDevice: camera. CameraDevice, cameraManager: camera. CameraManager) : Promise< camera. CameraInput | undefined > {
let cameraInput: camera. CameraInput | undefined = undefined ;
try {
cameraInput = cameraManager. createCameraInput ( cameraDevice) ;
} catch ( error) {
let err = error as BusinessError;
console. error ( 'Failed to createCameraInput errorCode = ' + err. code) ;
}
if ( cameraInput === undefined ) {
return undefined ;
}
cameraInput. on ( 'error' , cameraDevice, ( error: BusinessError ) => {
console. error ( ` Camera input error code: ${ error. code} ` ) ;
} ) ;
await cameraInput. open ( ) ;
return cameraInput;
}
5.获取当前相机设备支持的所有输出流
async getSupportedOutputCapability ( cameraDevice: camera. CameraDevice, cameraManager: camera. CameraManager) : Promise< camera. CameraOutputCapability | undefined > {
let cameraInput: camera. CameraInput | undefined = undefined ;
try {
cameraInput = cameraManager. createCameraInput ( cameraDevice) ;
} catch ( error) {
let err = error as BusinessError;
console. error ( 'Failed to createCameraInput errorCode = ' + err. code) ;
}
if ( cameraInput === undefined ) {
return undefined ;
}
cameraInput. on ( 'error' , cameraDevice, ( error: BusinessError ) => {
console. error ( ` Camera input error code: ${ error. code} ` ) ;
this . errorContent = ` Camera input error code: ${ error. code} `
} ) ;
await cameraInput. open ( ) ;
let cameraOutputCapability: camera. CameraOutputCapability = cameraManager. getSupportedOutputCapability ( cameraDevice) ;
if ( ! cameraOutputCapability) {
console. error ( "cameraManager.getSupportedOutputCapability error" ) ;
return undefined ;
}
console. info ( "outputCapability: " + JSON . stringify ( cameraOutputCapability) ) ;
this . showContent = 'cameraOutputCapability: ' + JSON . stringify ( cameraOutputCapability)
return cameraOutputCapability;
}
6.创建一个会话
getSession ( cameraManager: camera. CameraManager) : camera. Session | undefined {
let session: camera. Session | undefined = undefined ;
try {
session = cameraManager. createSession ( camera. SceneMode. NORMAL_PHOTO ) as camera. PhotoSession;
} catch ( error) {
let err = error as BusinessError;
console. error ( ` Failed to create the session instance. error: ${ JSON . stringify ( err) } ` ) ;
}
return session;
}
7.配置会话
beginConfig ( photoSession: camera. PhotoSession) : void {
try {
photoSession. beginConfig ( ) ;
} catch ( error) {
let err = error as BusinessError;
console. error ( ` Failed to beginConfig. error: ${ JSON . stringify ( err) } ` ) ;
}
}
8.向会话中添加相机的输入流和输出流
startSession ( photoSession: camera. PhotoSession, cameraInput: camera. CameraInput, previewOutput: camera. PreviewOutput, photoOutput: camera. PhotoOutput) : Promise< void > {
try {
photoSession. addInput ( cameraInput) ;
} catch ( error) {
let err = error as BusinessError;
console. error ( ` Failed to addInput. error: ${ JSON . stringify ( err) } ` ) ;
}
try {
photoSession. addOutput ( previewOutput) ;
} catch ( error) {
let err = error as BusinessError;
console. error ( ` Failed to add previewOutput. error: ${ JSON . stringify ( err) } ` ) ;
}
try {
photoSession. addOutput ( photoOutput) ;
} catch ( error) {
let err = error as BusinessError;
console. error ( ` Failed to add photoOutput. error: ${ JSON . stringify ( err) } ` ) ;
}
try {
await photoSession. commitConfig ( ) ;
} catch ( error) {
let err = error as BusinessError;
console. error ( ` Failed to commitConfig. error: ${ JSON . stringify ( err) } ` ) ;
}
try {
await photoSession. start ( ) ;
} catch ( error) {
let err = error as BusinessError;
console. error ( ` Failed to start. error: ${ JSON . stringify ( err) } ` ) ;
}
}
预览
1.创建Surface, 通过XComponent获取surfaceID
XComponent ( {
id: 'xComponentId' ,
type: XComponentType. SURFACE ,
libraryname: 'nativerender' ,
controller: this . mXComponentController
} )
. width ( this . isLand ? this . isVideoFullScreen ? '100%' : '75%' : CommonConstants. FULL_PERCENT )
. height ( this . isLand ?
this . isVideoFullScreen ? mScreenUtils. getScreenWidth ( ) * this . videoHeight / this . videoWidth : mScreenUtils. getScreenWidth ( ) * 0.75 * this . videoHeight / this . videoWidth :
mScreenUtils. getScreenWidth ( ) * this . videoHeight / this . videoWidth)
. onLoad ( ( ) => {
let surfaceID = this . mXComponentController. getXComponentSurfaceId ( )
} )
2.创建预览输出流
getPreviewOutput ( cameraManager: camera. CameraManager, cameraOutputCapability: camera. CameraOutputCapability, surfaceId: string) : camera. PreviewOutput | undefined {
let previewProfilesArray: Array< camera. Profile> = cameraOutputCapability. previewProfiles;
let previewOutput: camera. PreviewOutput | undefined = undefined ;
try {
previewOutput = cameraManager. createPreviewOutput ( previewProfilesArray[ 0 ] , surfaceId) ;
} catch ( error) {
let err = error as BusinessError;
console. error ( "Failed to create the PreviewOutput instance. error code: " + err. code) ;
}
return previewOutput;
}
3.输出预览流
startPreviewOutput ( cameraManager: camera. CameraManager, previewOutput: camera. PreviewOutput) : Promise< void > {
let cameraArray: Array< camera. CameraDevice> = [ ] ;
cameraArray = cameraManager. getSupportedCameras ( ) ;
if ( cameraArray. length == 0 ) {
console. error ( 'no camera.' ) ;
return ;
}
let sceneModes: Array< camera. SceneMode> = cameraManager. getSupportedSceneModes ( cameraArray[ 0 ] ) ;
let isSupportPhotoMode: boolean = sceneModes. indexOf ( camera. SceneMode. NORMAL_PHOTO ) >= 0 ;
if ( ! isSupportPhotoMode) {
console. error ( 'photo mode not support' ) ;
return ;
}
let cameraInput: camera. CameraInput | undefined = undefined ;
cameraInput = cameraManager. createCameraInput ( cameraArray[ 0 ] ) ;
if ( cameraInput === undefined ) {
console. error ( 'cameraInput is undefined' ) ;
return ;
}
await cameraInput. open ( ) ;
let session: camera. PhotoSession = cameraManager. createSession ( camera. SceneMode. NORMAL_PHOTO ) as camera. PhotoSession;
session. beginConfig ( ) ;
session. addInput ( cameraInput) ;
session. addOutput ( previewOutput) ;
await session. commitConfig ( ) ;
await session. start ( ) ;
}
拍照
1.导入image接口
import { image } from '@kit.ImageKit' ;
import { camera } from '@kit.CameraKit' ;
import { fileIo as fs } from '@kit.CoreFileKit' ;
import { photoAccessHelper } from '@kit.MediaLibraryKit' ;
import { BusinessError } from '@kit.BasicServicesKit' ;
2. 创建拍照输出流
getPhotoOutput ( cameraManager: camera. CameraManager, cameraOutputCapability: camera. CameraOutputCapability) : camera. PhotoOutput | undefined {
let photoProfilesArray: Array< camera. Profile> = cameraOutputCapability. photoProfiles;
if ( ! photoProfilesArray) {
console. error ( "createOutput photoProfilesArray == null || undefined" ) ;
}
let photoOutput: camera. PhotoOutput | undefined = undefined ;
try {
photoOutput = cameraManager. createPhotoOutput ( photoProfilesArray[ 0 ] ) ;
} catch ( error) {
let err = error as BusinessError;
console. error ( ` Failed to createPhotoOutput. error: ${ JSON . stringify ( err) } ` ) ;
}
return photoOutput;
}
3.设置拍照回调,保存图片
setPhotoOutputCb ( photoOutput: camera. PhotoOutput ) {
photoOutput. on ( 'photoAvailable' , ( errCode: BusinessError, photo: camera. Photo) : void => {
console. info ( 'getPhoto start' ) ;
console. info ( ` err: ${ JSON . stringify ( errCode) } ` ) ;
if ( errCode || photo === undefined ) {
console. error ( 'getPhoto failed' ) ;
return ;
}
let imageObj: image. Image = photo. main;
imageObj. getComponent ( image. ComponentType. JPEG , ( errCode: BusinessError, component: image. Component) : void => {
console. info ( 'getComponent start' ) ;
if ( errCode || component === undefined ) {
console. error ( 'getComponent failed' ) ;
return ;
}
let buffer: ArrayBuffer;
if ( component. byteBuffer) {
buffer = component. byteBuffer;
} else {
console. error ( 'byteBuffer is null' ) ;
return ;
}
imageObj. release ( ) ;
} ) ;
} ) ;
}
4.参数配置(闪光灯、变焦、焦距等)
configuringSession ( photoSession: camera. PhotoSession) : void {
let flashStatus: boolean = false ;
try {
flashStatus = photoSession. hasFlash ( ) ;
} catch ( error) {
let err = error as BusinessError;
console. error ( ` Failed to hasFlash. error: ${ JSON . stringify ( err) } ` ) ;
}
console. info ( ` Returned with the flash light support status: ${ flashStatus} ` ) ;
if ( flashStatus) {
let flashModeStatus: boolean = false ;
try {
let status: boolean = photoSession. isFlashModeSupported ( camera. FlashMode. FLASH_MODE_AUTO ) ;
flashModeStatus = status;
} catch ( error) {
let err = error as BusinessError;
console. error ( ` Failed to check whether the flash mode is supported. error: ${ JSON . stringify ( err) } ` ) ;
}
if ( flashModeStatus) {
try {
photoSession. setFlashMode ( camera. FlashMode. FLASH_MODE_AUTO ) ;
} catch ( error) {
let err = error as BusinessError;
console. error ( ` Failed to set the flash mode. error: ${ JSON . stringify ( err) } ` ) ;
}
}
}
let focusModeStatus: boolean = false ;
try {
let status: boolean = photoSession. isFocusModeSupported ( camera. FocusMode. FOCUS_MODE_CONTINUOUS_AUTO ) ;
focusModeStatus = status;
} catch ( error) {
let err = error as BusinessError;
console. error ( ` Failed to check whether the focus mode is supported. error: ${ JSON . stringify ( err) } ` ) ;
}
if ( focusModeStatus) {
try {
photoSession. setFocusMode ( camera. FocusMode. FOCUS_MODE_CONTINUOUS_AUTO ) ;
} catch ( error) {
let err = error as BusinessError;
console. error ( ` Failed to set the focus mode. error: ${ JSON . stringify ( err) } ` ) ;
}
}
let zoomRatioRange: Array< number> = [ ] ;
try {
zoomRatioRange = photoSession. getZoomRatioRange ( ) ;
} catch ( error) {
let err = error as BusinessError;
console. error ( ` Failed to get the zoom ratio range. error: ${ JSON . stringify ( err) } ` ) ;
}
if ( zoomRatioRange. length <= 0 ) {
return ;
}
try {
photoSession. setZoomRatio ( zoomRatioRange[ 0 ] ) ;
} catch ( error) {
let err = error as BusinessError;
console. error ( ` Failed to set the zoom ratio value. error: ${ JSON . stringify ( err) } ` ) ;
}
}
5.拍照
主要通过photoOutput类的capture方法,执行拍照任务
capture ( captureLocation: camera. Location, photoOutput: camera. PhotoOutput) : void {
let settings: camera. PhotoCaptureSetting = {
quality: camera. QualityLevel. QUALITY_LEVEL_HIGH,
rotation: camera. ImageRotation. ROTATION_0,
location: captureLocation,
mirror: false
} ;
photoOutput. capture ( settings, ( err: BusinessError) = > {
if ( err) {
console. error ( `Failed to capture the photo. error: ${ JSON. stringify ( err) } `) ;
this. errorContent = '`Failed to capture the photo. error: ' + JSON. stringify ( err)
return ;
}
console. info ( 'Callback invoked to indicate the photo capture request success.' ) ;
this. showContent = ' photo capture success'
} ) ;
}