# 预览(ArkTS) 在开å‘相机应用时,需è¦å…ˆå‚考开å‘准备[申请相关æƒé™](camera-preparation.md)。 预览是å¯åŠ¨ç›¸æœºåŽçœ‹è§çš„ç”»é¢ï¼Œé€šå¸¸åœ¨æ‹ç…§å’Œå½•åƒå‰æ‰§è¡Œã€‚ ## 开呿¥éª¤ 详细的API说明请å‚考[Camera APIå‚考](../../reference/apis-camera-kit/js-apis-camera.md)。 1. 导入camera接å£ï¼ŒæŽ¥å£ä¸æä¾›äº†ç›¸æœºç›¸å…³çš„属性和方法,导入方法如下。 ```ts import { camera } from '@kit.CameraKit'; import { BusinessError } from '@kit.BasicServicesKit'; ``` 2. 创建Surface。 XComponentç»„ä»¶ä¸ºé¢„è§ˆæµæä¾›çš„Surface(获å–surfaceId请å‚考[getXcomponentSurfaceId](../../reference/apis-arkui/arkui-ts/ts-basic-components-xcomponent.md#getxcomponentsurfaceid9)方法),而XComponent的能力由UIæä¾›ï¼Œç›¸å…³ä»‹ç»å¯å‚考[XComponent组件å‚考](../../reference/apis-arkui/arkui-ts/ts-basic-components-xcomponent.md)。 > **说明:** > 预览æµä¸Žå½•åƒè¾“出æµçš„分辨率的宽高比è¦ä¿æŒä¸€è‡´ï¼Œå¦‚果设置XComponent组件ä¸çš„Surface显示区域宽高比为1920:1080 = 16:9,则需è¦é¢„览æµä¸çš„分辨率的宽高比也为16:9,如分辨率选择640:360,或960:540,或1920:1080,以æ¤ç±»æŽ¨ã€‚ 3. 通过[CameraOutputCapability](../../reference/apis-camera-kit/js-apis-camera.md#cameraoutputcapability)ç±»ä¸çš„previewProfiles属性获å–当å‰è®¾å¤‡æ”¯æŒçš„预览能力,返回previewProfilesArray数组 。通过[createPreviewOutput](../../reference/apis-camera-kit/js-apis-camera.md#createpreviewoutput)方法创建预览输出æµï¼Œå…¶ä¸ï¼Œ[createPreviewOutput](../../reference/apis-camera-kit/js-apis-camera.md#createpreviewoutput)方法ä¸çš„ä¸¤ä¸ªå‚æ•°åˆ†åˆ«æ˜¯previewProfilesArray数组ä¸çš„第一项和æ¥éª¤äºŒä¸èŽ·å–çš„surfaceId。 ```ts function 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; } ``` 4. 使能。通过[Session.start](../../reference/apis-camera-kit/js-apis-camera.md#start11)方法输出预览æµï¼ŒæŽ¥å£è°ƒç”¨å¤±è´¥ä¼šè¿”回相应错误ç ,错误ç 类型å‚è§[Camera错误ç ](../../reference/apis-camera-kit/js-apis-camera.md#cameraerrorcode)。 ```ts async function 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(); } ``` ## 状æ€ç›‘å¬ åœ¨ç›¸æœºåº”ç”¨å¼€å‘过程ä¸ï¼Œå¯ä»¥éšæ—¶ç›‘å¬é¢„览输出æµçжæ€ï¼ŒåŒ…括预览æµå¯åЍã€é¢„览æµç»“æŸã€é¢„览æµè¾“出错误。 - 通过注册固定的frameStart回调函数获å–监å¬é¢„览å¯åŠ¨ç»“æžœï¼ŒpreviewOutput创建æˆåŠŸæ—¶å³å¯ç›‘å¬ï¼Œé¢„览第一次æ›å…‰æ—¶è§¦å‘,有该事件返回结果则认为预览æµå·²å¯åŠ¨ã€‚ ```ts function onPreviewOutputFrameStart(previewOutput: camera.PreviewOutput): void { previewOutput.on('frameStart', (err: BusinessError) => { if (err !== undefined && err.code !== 0) { return; } console.info('Preview frame started'); }); } ``` - 通过注册固定的frameEnd回调函数获å–监å¬é¢„览结æŸç»“果,previewOutput创建æˆåŠŸæ—¶å³å¯ç›‘å¬ï¼Œé¢„è§ˆå®Œæˆæœ€åŽä¸€å¸§æ—¶è§¦å‘,有该事件返回结果则认为预览æµå·²ç»“æŸã€‚ ```ts function onPreviewOutputFrameEnd(previewOutput: camera.PreviewOutput): void { previewOutput.on('frameEnd', (err: BusinessError) => { if (err !== undefined && err.code !== 0) { return; } console.info('Preview frame ended'); }); } ``` - 通过注册固定的error回调函数获å–监å¬é¢„览输出错误结果,回调返回预览输出接å£ä½¿ç”¨é”™è¯¯æ—¶å¯¹åº”的错误ç ,错误ç 类型å‚è§[Camera错误ç ](../../reference/apis-camera-kit/js-apis-camera.md#cameraerrorcode)。 ```ts function onPreviewOutputError(previewOutput: camera.PreviewOutput): void { previewOutput.on('error', (previewOutputError: BusinessError) => { console.error(`Preview output error code: ${previewOutputError.code}`); }); } ```