From adeef9d6f9b78c68567f856ad337099a28b821ad Mon Sep 17 00:00:00 2001 From: kuangning <2540487435@qq.com> Date: Thu, 15 May 2025 19:32:28 +0800 Subject: [PATCH 1/2] =?UTF-8?q?CameraKit=E6=B7=BB=E5=8A=A0=E6=A0=87?= =?UTF-8?q?=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/ets/entryability/EntryAbility.ets | 42 +++-- .../src/main/ets/pages/GetCameraStatus.ets | 8 +- .../main/ets/pages/GetFrontCameraImage.ets | 6 +- .../main/ets/pages/RealizePhotoPreview.ets | 88 ++++++---- .../ResolvePreviewStreamBlackScreenIssue.ets | 159 ++++-------------- ...solvePreviewStreamBlackScreenIssuePage.ets | 59 +++++++ .../ets/pages/SetVideoPreviewResolution.ets | 40 +++-- CameraKit/entry/src/main/module.json5 | 50 +++++- .../main/resources/base/element/string.json | 4 + .../resources/base/profile/main_pages.json | 7 +- 10 files changed, 264 insertions(+), 199 deletions(-) create mode 100644 CameraKit/entry/src/main/ets/pages/ResolvePreviewStreamBlackScreenIssuePage.ets diff --git a/CameraKit/entry/src/main/ets/entryability/EntryAbility.ets b/CameraKit/entry/src/main/ets/entryability/EntryAbility.ets index 508880a..8960efa 100644 --- a/CameraKit/entry/src/main/ets/entryability/EntryAbility.ets +++ b/CameraKit/entry/src/main/ets/entryability/EntryAbility.ets @@ -1,6 +1,7 @@ -import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { abilityAccessCtrl, AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; import { window } from '@kit.ArkUI'; +import { BusinessError } from '@kit.BasicServicesKit'; const DOMAIN = 0x0000; @@ -14,18 +15,39 @@ export default class EntryAbility extends UIAbility { hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy'); } + /* + * FAQ:预览流黑屏但无报错信息该怎么解决 + */ + + // [Start ResolvePreviewStreamBlackScreenIssue_EntryAbility] onWindowStageCreate(windowStage: window.WindowStage): void { - // Main window is created, set main page for this ability - hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); - - windowStage.loadContent('pages/Index', (err) => { - if (err.code) { - hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err)); - return; - } - hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.'); + let atManager = abilityAccessCtrl.createAtManager(); + atManager.requestPermissionsFromUser(this.context, + [ + 'ohos.permission.CAMERA', + 'ohos.permission.MICROPHONE', + 'ohos.permission.MEDIA_LOCATION', + 'ohos.permission.WRITE_MEDIA' + ] + ).then((data) => { + console.info('data:' + JSON.stringify(data)); + console.info('data permissions:' + data.permissions); + console.info('data authResults:' + data.authResults); + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/CameraPreviewFlow', (err, data) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? ''); + }); + }).catch((err: BusinessError) => { + console.info('data:' + JSON.stringify(err)); }); } + // [End ResolvePreviewStreamBlackScreenIssue_EntryAbility] onWindowStageDestroy(): void { // Main window is destroyed, release UI related resources diff --git a/CameraKit/entry/src/main/ets/pages/GetCameraStatus.ets b/CameraKit/entry/src/main/ets/pages/GetCameraStatus.ets index f3f03d6..9b8c2df 100644 --- a/CameraKit/entry/src/main/ets/pages/GetCameraStatus.ets +++ b/CameraKit/entry/src/main/ets/pages/GetCameraStatus.ets @@ -17,13 +17,13 @@ * FAQ:如何检测当前相机服务的状态 */ -// DocsCode 1 +// [Start GetCameraStatus] import { camera } from '@kit.CameraKit'; import { BusinessError } from '@kit.BasicServicesKit'; - -let cameraManager = camera.getCameraManager(UIContext.getHostContext()!); +const context = AppStorage.get("context") as UIContext; +let cameraManager = camera.getCameraManager(context.getHostContext()!); cameraManager.on('cameraStatus', (err: BusinessError, cameraStatusInfo: camera.CameraStatusInfo) => { console.log(`camera : ${cameraStatusInfo.camera.cameraId}`); console.log(`status: ${cameraStatusInfo.status}`); }); -// DocsCode 1 \ No newline at end of file +// [End GetCameraStatus] \ No newline at end of file diff --git a/CameraKit/entry/src/main/ets/pages/GetFrontCameraImage.ets b/CameraKit/entry/src/main/ets/pages/GetFrontCameraImage.ets index 4a689cc..afcfe51 100644 --- a/CameraKit/entry/src/main/ets/pages/GetFrontCameraImage.ets +++ b/CameraKit/entry/src/main/ets/pages/GetFrontCameraImage.ets @@ -17,12 +17,12 @@ * FAQ:如何获取前置摄像头的预览图像 */ -// DocsCode 1 +// [Start GetFrontCameraImage] import { BusinessError } from '@kit.BasicServicesKit'; import { camera } from '@kit.CameraKit'; import { common } from '@kit.AbilityKit'; -const context = UIContext.getHostContext()! as common.UIAbilityContext; +const context = AppStorage.get("context") as common.UIAbilityContext; @Entry @Component @@ -74,4 +74,4 @@ struct GetFrontCameraImage { .height('100%') } } -// DocsCode 1 \ No newline at end of file +// [End GetFrontCameraImage] \ No newline at end of file diff --git a/CameraKit/entry/src/main/ets/pages/RealizePhotoPreview.ets b/CameraKit/entry/src/main/ets/pages/RealizePhotoPreview.ets index 334627d..2606b25 100644 --- a/CameraKit/entry/src/main/ets/pages/RealizePhotoPreview.ets +++ b/CameraKit/entry/src/main/ets/pages/RealizePhotoPreview.ets @@ -12,47 +12,63 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { image } from '@kit.ImageKit'; +import { BusinessError } from '@kit.BasicServicesKit'; +import { fileIo, WriteOptions } from '@kit.CoreFileKit'; +import { camera } from '@kit.CameraKit'; /* * FAQ:如何实现拍照预览onPreviewFrame回调 */ +let previewProfilesArray = []; +let surfaceId = ''; +const context = AppStorage.get("context") as Context; -// DocsCode 1 -this.previewOutput = this.cameraManager!.createPreviewOutput(previewProfilesArray[5], surfaceId); -let size: image.Size = { - width: 640, - height: 480 -} -let receiver: image.ImageReceiver = image.createImageReceiver(size, image.ImageFormat.JPEG, 8); -receiver.on('imageArrival', () => { - receiver.readNextImage((err: BusinessError, nextImage: image.Image) => { - if (err || nextImage === undefined) { - console.error('readNextImage failed'); - return; +class RealizePhotoPreview { + cameraManager = camera.getCameraManager(context) + private previewOutput: camera.PreviewOutput | null = null; + private previewOutput2: camera.PreviewOutput | null = null; + count: number = 0; + + async cameraFun() { + // [Start RealizePhotoPreview] + this.previewOutput = this.cameraManager!.createPreviewOutput(previewProfilesArray[5], surfaceId); + let size: image.Size = { + width: 640, + height: 480 } - nextImage.getComponent(image.ComponentType.JPEG, (err: BusinessError, imgComponent: image.Component) => { - if (err || imgComponent === undefined) { - console.error('getComponent failed'); - } - if (imgComponent && imgComponent.byteBuffer as ArrayBuffer && this.count<3) { - this.count = this.count + 1 - let path: string = this.getUIContext().getHostContext()!.filesDir + "/image.yuv"; - let file = fileIo.openSync(path, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE); - let opt: WriteOptions = { - // 多出2048字节数据 - length: imgComponent.byteBuffer.byteLength - 2048 + let receiver: image.ImageReceiver = image.createImageReceiver(size, image.ImageFormat.JPEG, 8); + receiver.on('imageArrival', () => { + receiver.readNextImage((err: BusinessError, nextImage: image.Image) => { + if (err || nextImage === undefined) { + console.error('readNextImage failed'); + return; } - fileIo.write(file.fd, imgComponent.byteBuffer, opt).then((writeLen) => { - console.info("write data to file succeed and size is:" + writeLen); - fileIo.closeSync(file); - }).catch((err: BusinessError) => { - console.info("write data to file failed with error message: " + err.message + ", error code: " + err.code); - }); - } - nextImage.release(); + nextImage.getComponent(image.ComponentType.JPEG, (err: BusinessError, imgComponent: image.Component) => { + if (err || imgComponent === undefined) { + console.error('getComponent failed'); + } + if (imgComponent && imgComponent.byteBuffer as ArrayBuffer && this.count<3) { + this.count = this.count + 1 + let path: string = context.filesDir + "/image.yuv"; + let file = fileIo.openSync(path, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE); + let opt: WriteOptions = { + // 多出2048字节数据 + length: imgComponent.byteBuffer.byteLength - 2048 + } + fileIo.write(file.fd, imgComponent.byteBuffer, opt).then((writeLen) => { + console.info("write data to file succeed and size is:" + writeLen); + fileIo.closeSync(file); + }).catch((err: BusinessError) => { + console.info("write data to file failed with error message: " + err.message + ", error code: " + err.code); + }); + } + nextImage.release(); + }) + }) }) - }) -}) -let ImageReceiverSurfaceId: string = await receiver.getReceivingSurfaceId(); -this.previewOutput2 = this.cameraManager!.createPreviewOutput(previewProfilesArray[5], ImageReceiverSurfaceId); -// DocsCode 1 \ No newline at end of file + let ImageReceiverSurfaceId: string = await receiver.getReceivingSurfaceId(); + this.previewOutput2 = this.cameraManager!.createPreviewOutput(previewProfilesArray[5], ImageReceiverSurfaceId); + // [End RealizePhotoPreview] + } +} \ No newline at end of file diff --git a/CameraKit/entry/src/main/ets/pages/ResolvePreviewStreamBlackScreenIssue.ets b/CameraKit/entry/src/main/ets/pages/ResolvePreviewStreamBlackScreenIssue.ets index 6540213..50de6b3 100644 --- a/CameraKit/entry/src/main/ets/pages/ResolvePreviewStreamBlackScreenIssue.ets +++ b/CameraKit/entry/src/main/ets/pages/ResolvePreviewStreamBlackScreenIssue.ets @@ -16,133 +16,38 @@ /* * FAQ:预览流黑屏但无报错信息该怎么解决 */ +import { camera } from '@kit.CameraKit'; -// DocsCode 1 -"requestPermissions": [ -{ - "name": - "ohos.permission.CAMERA", "usedScene": - { - "abilities": [ - "FormAbility" ], - "when": - "always" - } - , - "reason": - "$string:Camera_Permission_Request" -} -, -{ - "name": - "ohos.permission.MICROPHONE", "usedScene": - { - "abilities": [ - "FormAbility" ], - "when": - "always" - } - , - "reason": - "$string:Camera_Permission_Request" -} -, -{ - "name": - "ohos.permission.WRITE_MEDIA", "usedScene": - { - "abilities": [ - "FormAbility" ], - "when": - "always" - } - , - "reason": - "$string:Camera_Permission_Request" -} -, -{ - "name": - "ohos.permission.READ_MEDIA", "usedScene": - { - "abilities": [ - "FormAbility" ], - "when": - "always" - } - , - "reason": - "$string:Camera_Permission_Request" -} -] -, -// DocsCode 1 - -// DocsCode 2 -onWindowStageCreate(windowStage: window.WindowStage): void { - let atManager = abilityAccessCtrl.createAtManager(); - atManager.requestPermissionsFromUser(this.context, - [ - 'ohos.permission.CAMERA', - 'ohos.permission.MICROPHONE', - 'ohos.permission.MEDIA_LOCATION', - 'ohos.permission.WRITE_MEDIA' - ] - ).then((data) => { - console.info('data:' + JSON.stringify(data)); - console.info('data permissions:' + data.permissions); - console.info('data authResults:' + data.authResults); - // Main window is created, set main page for this ability - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); +const TAG = '' +const context = AppStorage.get("context") as Context; - windowStage.loadContent('pages/CameraPreviewFlow', (err, data) => { - if (err.code) { - hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); - return; -} -hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? ''); -}); -}).catch((err: BusinessError) => { - console.info('data:' + JSON.stringify(err)); -}); -} -// DocsCode 2 +const cameraFun = () => { + let cameraManager = camera.getCameraManager(context) + let cameraArray = [] -// DocsCode 3 -async -onPageShow() { - let baseContext = this.getUIContext().getHostContext()! as common.BaseContext; - await this.initCamera(baseContext, this.surfaceId); -} - -async -onPageHide() { - await this.releaseCamera(); -} -// DocsCode 3 - -// DocsCode 4 -// 获取相机设备支持的输出流能力 -let cameraOutputCap: camera.CameraOutputCapability = - cameraManager.getSupportedOutputCapability(cameraArray[0], camera.SceneMode.NORMAL_PHOTO); -if (!cameraOutputCap) { - console.error(TAG, "cameraManager.getSupportedOutputCapability error"); - return; -} -console.info(TAG, "outputCapability: " + -JSON.stringify(cameraOutputCap)); //预览流与录像输出流的分辨率的宽高比要保持一致 -let previewProfilesArray: Array = cameraOutputCap.previewProfiles; -let position: number = 0; -if (previewProfilesArray != null) { - previewProfilesArray.forEach((value: camera.Profile, - index: number) => { // 查看支持的预览尺寸 - console.info(TAG, - `支持的预览尺寸: [${value.size.width},${value.size.height},${value.size.width / value.size.height}]`); - if (value.size.width === 2592 && value.size.height === 1200) { - position = index; - } - }) -} else { - console.error(TAG, "createOutput photoProfilesArray == null || undefined"); -} -// DocsCode 4 \ No newline at end of file + // [Start ResolvePreviewStreamBlackScreenIssue_Fun] + // 获取相机设备支持的输出流能力 + let cameraOutputCap: camera.CameraOutputCapability = + cameraManager.getSupportedOutputCapability(cameraArray[0], camera.SceneMode.NORMAL_PHOTO); + if (!cameraOutputCap) { + console.error(TAG, "cameraManager.getSupportedOutputCapability error"); + return; + } + console.info(TAG, "outputCapability: " + + JSON.stringify(cameraOutputCap)); //预览流与录像输出流的分辨率的宽高比要保持一致 + let previewProfilesArray: Array = cameraOutputCap.previewProfiles; + let position: number = 0; + if (previewProfilesArray != null) { + previewProfilesArray.forEach((value: camera.Profile, + index: number) => { // 查看支持的预览尺寸 + console.info(TAG, + `支持的预览尺寸: [${value.size.width},${value.size.height},${value.size.width / value.size.height}]`); + if (value.size.width === 2592 && value.size.height === 1200) { + position = index; + } + }) + } else { + console.error(TAG, "createOutput photoProfilesArray == null || undefined"); + } + // [End ResolvePreviewStreamBlackScreenIssue_Fun] +} \ No newline at end of file diff --git a/CameraKit/entry/src/main/ets/pages/ResolvePreviewStreamBlackScreenIssuePage.ets b/CameraKit/entry/src/main/ets/pages/ResolvePreviewStreamBlackScreenIssuePage.ets new file mode 100644 index 0000000..f9c9bed --- /dev/null +++ b/CameraKit/entry/src/main/ets/pages/ResolvePreviewStreamBlackScreenIssuePage.ets @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2024 Huawei Device Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +/* +* FAQ:预览流黑屏但无报错信息该怎么解决 +*/ +import { common } from '@kit.AbilityKit'; + +@Entry +@Component +struct ResolvePreviewStreamBlackScreenIssuePage { + @State message: string = 'Hello World'; + surfaceId: string = ''; + + // [Start ResolvePreviewStreamBlackScreenIssuePage] + async onPageShow() { + let baseContext = this.getUIContext().getHostContext()! as common.BaseContext; + await this.initCamera(baseContext, this.surfaceId); + } + + async onPageHide() { + await this.releaseCamera(); + } + // [End ResolvePreviewStreamBlackScreenIssuePage] + + async initCamera(context: common.BaseContext, surfaceId: string) {} + + async releaseCamera() {} + + build() { + RelativeContainer() { + Text(this.message) + .id('ResolvePreviewStreamBlackScreenIssuePageHelloWorld') + .fontSize($r('app.float.page_text_font_size')) + .fontWeight(FontWeight.Bold) + .alignRules({ + center: { anchor: '__container__', align: VerticalAlign.Center }, + middle: { anchor: '__container__', align: HorizontalAlign.Center } + }) + .onClick(() => { + this.message = 'Welcome'; + }) + } + .height('100%') + .width('100%') + } +} \ No newline at end of file diff --git a/CameraKit/entry/src/main/ets/pages/SetVideoPreviewResolution.ets b/CameraKit/entry/src/main/ets/pages/SetVideoPreviewResolution.ets index 47b1b68..94ab776 100644 --- a/CameraKit/entry/src/main/ets/pages/SetVideoPreviewResolution.ets +++ b/CameraKit/entry/src/main/ets/pages/SetVideoPreviewResolution.ets @@ -16,16 +16,32 @@ /* * FAQ:视频预览分辨率设置 */ +import { common } from '@kit.AbilityKit'; -// DocsCode 1 -XComponent({ - id: 'componentId', - type: 'surface', - controller: this.mXComponentController, -}).onLoad(async () => { - this.surfaceId = this.mXComponentController.getXComponentSurfaceId(); - let baseContext = this.getUIContext().getHostContext()! as common.BaseContext; - await this.initCamera(baseContext, this.surfaceId) -}).width('100%') - .height('100%') -// DocsCode 1 \ No newline at end of file +@Entry +@Component +struct SetVideoPreviewResolution { + surfaceId: string = ''; + mXComponentController: XComponentController = new XComponentController(); + + async initCamera(context: common.BaseContext, surfaceId: string) {} + + build() { + RelativeContainer() { + // [Start SetVideoPreviewResolution] + XComponent({ + id: 'componentId', + type: 'surface', + controller: this.mXComponentController, + }).onLoad(async () => { + this.surfaceId = this.mXComponentController.getXComponentSurfaceId(); + let baseContext = this.getUIContext().getHostContext()! as common.BaseContext; + await this.initCamera(baseContext, this.surfaceId) + }).width('100%') + .height('100%') + // [End SetVideoPreviewResolution] + } + .height('100%') + .width('100%') + } +} diff --git a/CameraKit/entry/src/main/module.json5 b/CameraKit/entry/src/main/module.json5 index a1cea8b..be1e373 100644 --- a/CameraKit/entry/src/main/module.json5 +++ b/CameraKit/entry/src/main/module.json5 @@ -47,6 +47,54 @@ } ], } - ] + ], + /* + * FAQ:预览流黑屏但无报错信息该怎么解决 + */ + + // [Start ResolvePreviewStreamBlackScreenIssue_Permissions] + "requestPermissions": [ + { + "name": "ohos.permission.CAMERA", + "usedScene": { + "abilities": [ + "FormAbility" + ], + "when": "always" + }, + "reason": "$string:Camera_Permission_Request" + }, + { + "name": "ohos.permission.MICROPHONE", + "usedScene": { + "abilities": [ + "FormAbility" + ], + "when": "always" + }, + "reason": "$string:Camera_Permission_Request" + }, + { + "name": "ohos.permission.WRITE_MEDIA", + "usedScene": { + "abilities": [ + "FormAbility" + ], + "when": "always" + }, + "reason": "$string:Camera_Permission_Request" + }, + { + "name": "ohos.permission.READ_MEDIA", + "usedScene": { + "abilities": [ + "FormAbility" + ], + "when": "always" + }, + "reason": "$string:Camera_Permission_Request" + } + ], + // [End ResolvePreviewStreamBlackScreenIssue_Permission] } } \ No newline at end of file diff --git a/CameraKit/entry/src/main/resources/base/element/string.json b/CameraKit/entry/src/main/resources/base/element/string.json index f945955..723008b 100644 --- a/CameraKit/entry/src/main/resources/base/element/string.json +++ b/CameraKit/entry/src/main/resources/base/element/string.json @@ -11,6 +11,10 @@ { "name": "EntryAbility_label", "value": "label" + }, + { + "name": "Camera_Permission_Request", + "value": "" } ] } \ No newline at end of file diff --git a/CameraKit/entry/src/main/resources/base/profile/main_pages.json b/CameraKit/entry/src/main/resources/base/profile/main_pages.json index 9749d1a..55c3f00 100644 --- a/CameraKit/entry/src/main/resources/base/profile/main_pages.json +++ b/CameraKit/entry/src/main/resources/base/profile/main_pages.json @@ -1,10 +1,5 @@ { "src": [ - "pages/Index", - "pages/GetFrontCameraImage", - "pages/GetCameraStatus", - "pages/ResolvePreviewStreamBlackScreenIssue", - "pages/SetVideoPreviewResolution", - "pages/RealizePhotoPreview" + "pages/Index" ] } \ No newline at end of file -- Gitee From 5d31eab3d05b26030cca992bc097714f687f7bd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A3=8E=E9=93=83?= <2540487435@qq.com> Date: Sat, 17 May 2025 06:09:41 +0000 Subject: [PATCH 2/2] =?UTF-8?q?Camera=E4=BF=AE=E6=94=B9=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E4=B8=BA=E8=8B=B1=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 风铃 <2540487435@qq.com> --- .../src/main/ets/pages/GetFrontCameraImage.ets | 16 ++++++++-------- .../src/main/ets/pages/RealizePhotoPreview.ets | 2 +- .../ResolvePreviewStreamBlackScreenIssue.ets | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/CameraKit/entry/src/main/ets/pages/GetFrontCameraImage.ets b/CameraKit/entry/src/main/ets/pages/GetFrontCameraImage.ets index afcfe51..0a3fc20 100644 --- a/CameraKit/entry/src/main/ets/pages/GetFrontCameraImage.ets +++ b/CameraKit/entry/src/main/ets/pages/GetFrontCameraImage.ets @@ -30,26 +30,26 @@ struct GetFrontCameraImage { private xComponentController: XComponentController = new XComponentController(); async getCameraImage() { - // 1、使用系统相机框架camera模块获取物理摄像头信息。 + // 1、Use the system camera framework camera module to obtain physical camera information. let cameraManager = camera.getCameraManager(context); let camerasInfo: Array = cameraManager.getSupportedCameras(); let cameraDevice: camera.CameraDevice = camerasInfo[0]; - // 检测相机状态 + // Detecting camera status cameraManager.on('cameraStatus', (err: BusinessError, cameraStatusInfo: camera.CameraStatusInfo) => { console.log(`camera : ${cameraStatusInfo.camera.cameraId}`); console.log(`status : : ${cameraStatusInfo.status}`); }); - // 2、创建并启动物理摄像头输入流通道 - // 设置为前置摄像头 camera.CameraPosition.CAMERA_POSITION_FRONT + // 2、Create and start a physical camera input stream channel + // Set as front camera camera.CameraPosition.CAMERA_POSITION_FRONT let cameraInput = cameraManager.createCameraInput(camera.CameraPosition.CAMERA_POSITION_FRONT, camera.CameraType.CAMERA_TYPE_DEFAULT); await cameraInput.open(); - // 3、拿到物理摄像头信息查询摄像头支持预览流支持的输出格式,结合XComponent提供的surfaceId创建预览输出通道 + // 3、Retrieve the physical camera information and query the output formats supported by the preview stream of the camera. Create a preview output channel by combining it with the surfeId provided by XCompoonent let outputCapability = cameraManager.getSupportedOutputCapability(cameraDevice, camera.SceneMode.NORMAL_PHOTO); let previewProfile = outputCapability.previewProfiles[0]; let surfaceId = this.xComponentController.getXComponentSurfaceId(); let previewOutput = cameraManager.createPreviewOutput(previewProfile, surfaceId); - // 4、创建相机会话,在会话中添加摄像头输入流和预览输出流,然后启动会话,预览画面就会在XComponent组件上送显。 + // 4、Create a camera session, add the camera input stream and preview output stream in the session, then start the session, and the preview image will be displayed on the XCompoonent component. let captureSession = cameraManager.createSession(camera.SceneMode.NORMAL_PHOTO); captureSession.beginConfig(); captureSession.addInput(cameraInput); @@ -63,9 +63,9 @@ struct GetFrontCameraImage { Column({ space: 20 }) { XComponent({ id: 'xComponentId1', type: 'surface', controller: this.xComponentController }) .height(300) - Button('打开摄像头') + Button('Turn on the camera') .onClick(() => { - // 在调用前确保已经获得相机权限 + // Ensure that camera permissions have been obtained before calling this.getCameraImage(); }) } diff --git a/CameraKit/entry/src/main/ets/pages/RealizePhotoPreview.ets b/CameraKit/entry/src/main/ets/pages/RealizePhotoPreview.ets index 2606b25..e17e41b 100644 --- a/CameraKit/entry/src/main/ets/pages/RealizePhotoPreview.ets +++ b/CameraKit/entry/src/main/ets/pages/RealizePhotoPreview.ets @@ -53,7 +53,7 @@ class RealizePhotoPreview { let path: string = context.filesDir + "/image.yuv"; let file = fileIo.openSync(path, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE); let opt: WriteOptions = { - // 多出2048字节数据 + // 2048 extra bytes of data length: imgComponent.byteBuffer.byteLength - 2048 } fileIo.write(file.fd, imgComponent.byteBuffer, opt).then((writeLen) => { diff --git a/CameraKit/entry/src/main/ets/pages/ResolvePreviewStreamBlackScreenIssue.ets b/CameraKit/entry/src/main/ets/pages/ResolvePreviewStreamBlackScreenIssue.ets index 50de6b3..18f57df 100644 --- a/CameraKit/entry/src/main/ets/pages/ResolvePreviewStreamBlackScreenIssue.ets +++ b/CameraKit/entry/src/main/ets/pages/ResolvePreviewStreamBlackScreenIssue.ets @@ -26,7 +26,7 @@ const cameraFun = () => { let cameraArray = [] // [Start ResolvePreviewStreamBlackScreenIssue_Fun] - // 获取相机设备支持的输出流能力 + // Obtain the output stream capability supported by the camera device let cameraOutputCap: camera.CameraOutputCapability = cameraManager.getSupportedOutputCapability(cameraArray[0], camera.SceneMode.NORMAL_PHOTO); if (!cameraOutputCap) { @@ -34,14 +34,14 @@ const cameraFun = () => { return; } console.info(TAG, "outputCapability: " + - JSON.stringify(cameraOutputCap)); //预览流与录像输出流的分辨率的宽高比要保持一致 + JSON.stringify(cameraOutputCap)); //The aspect ratio of the preview stream and the video output stream resolution should be consistent let previewProfilesArray: Array = cameraOutputCap.previewProfiles; let position: number = 0; if (previewProfilesArray != null) { previewProfilesArray.forEach((value: camera.Profile, - index: number) => { // 查看支持的预览尺寸 + index: number) => { // View supported preview sizes console.info(TAG, - `支持的预览尺寸: [${value.size.width},${value.size.height},${value.size.width / value.size.height}]`); + `Supported preview sizes: [${value.size.width},${value.size.height},${value.size.width / value.size.height}]`); if (value.size.width === 2592 && value.size.height === 1200) { position = index; } -- Gitee