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. lengthfor ( 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' } ) ; }