HarmonyOS 鸿蒙Next中如何指定摄像头?

HarmonyOS 鸿蒙Next中如何指定摄像头? cameraManager.getSupportedCameras(),是否可以获取所有物理摄像头?

cameraManager.createCameraInput(),能否指定使用广角/长焦等摄像头?

HarmonyOS 5.0.0

比如我想指定使用长焦摄像头,是否有办法做到?

CameraType中的CAMERA_TYPE_WIDE_ANGLE,CAMERA_TYPE_ULTRA_WIDE,CAMERA_TYPE_TELEPHOTO指的是什么?

8 回复

cameraManager.getSupportedCameras()获取到的是设备的逻辑摄像头并非单个的物理摄像头(广角相机、长焦相机等),在没有连接到其他分布式设备时,获取到的是当前设备的逻辑摄像头,如果当前设备是手机,则获取到的是前置摄像头和后置摄像头。

cameraManager.createCameraInput(),能指定的也是逻辑摄像头。

希望以上内容能够帮助到你。

更多关于HarmonyOS 鸿蒙Next中如何指定摄像头?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


比如我想指定使用长焦摄像头,是否有办法做到?

通过CameraManager获取设备支持的摄像头列表,并筛选出长焦类型

import { camera } from '@kit.CameraKit';

let cameraManager = camera.getCameraManager(context);
let cameraIds = cameraManager.getCameraIds();
cameraIds.forEach(cameraId => {
  let cameraInfo = cameraManager.getCameraInfo(cameraId);
  if (cameraInfo.cameraType === camera.CameraType.CAMERA_TYPE_TELEPHOTO) {
    // 找到长焦摄像头ID
  }
});

当存在长焦摄像头时,可通过CameraOutputCapability设置摄像头参数

let cameraOutputCapability = cameraManager.getSupportedOutputCapability(cameraId);
let telephotoConfig: camera.CameraConfig = {
  cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK,
  cameraType: camera.CameraType.CAMERA_TYPE_TELEPHOTO
};

通过筛选到的摄像头ID创建会话

let telephotoDevice = cameraManager.createCameraDevice(cameraId);
let session = telephotoDevice.createCaptureSession();
session.beginConfig();
// 添加输出配置...
session.commitConfig();

包含三种类型:

CAMERA_TYPE_WIDE_ANGLE:广角镜头(默认主摄)

CAMERA_TYPE_ULTRA_WIDE:超广角镜头

CAMERA_TYPE_TELEPHOTO:长焦镜头

cameraManager.getSupportedCameras()会返回当前设备支持的物理摄像头列表,可通过遍历列表获取每个摄像头的属性:

let cameraArray: camera.CameraDevice[] = cameraManager.getSupportedCameras();

cameraArray.forEach(device => {
  console.info(`cameraId: ${device.cameraId}, type: ${device.cameraType}`);
});

指定特定类型摄像头

通过筛选cameraType属性选择目标摄像头,再用createCameraInput()创建输入流,以指定使用长焦摄像头为例

let telePhotoDevice: camera.CameraDevice | undefined;

for (let device of cameraArray) {
  if (device.cameraType === camera.CameraType.CAMERA_TYPE_TELEPHOTO) {
    telePhotoDevice = device;
    break;
  }
}

if (telePhotoDevice) {
  let cameraInput = cameraManager.createCameraInput(telePhotoDevice);
  await cameraInput.open();
}

楼主需要注意:选定摄像头后,需通过getSupportedOutputCapability获取其支持的输出流配置:

let outputCapability = cameraManager.getSupportedOutputCapability(
  telePhotoDevice, 
  camera.SceneMode.NORMAL_PHOTO
);

let previewProfiles = outputCapability.previewProfiles;

可据此配置预览/拍摄参数

如果楼主需要根据折叠状态自动切换摄像头,可结合display模块监听折叠状态变化,并重新初始化摄像头输入

调用示例

import { camera } from '@kit.CameraKit';
import { BusinessError } from '@kit.BasicServicesKit';

async function setupTelePhotoCamera() {
  try {
    // 获取CameraManager实例
    let context = getContext(this) as common.UIAbilityContext;
    let cameraManager = camera.getCameraManager(context);
    // 获取所有物理摄像头
    let cameraArray = cameraManager.getSupportedCameras();
    if (cameraArray.length === 0) {
      throw new Error('No available cameras');
    }
    // 筛选长焦摄像头
    let telePhotoDevice = cameraArray.find(
      device => device.cameraType === camera.CameraType.CAMERA_TYPE_TELEPHOTO
    );
    if (!telePhotoDevice) {
      throw new Error('Telephoto camera not found');
    }
    // 创建并打开输入流
    let cameraInput = cameraManager.createCameraInput(telePhotoDevice);
    await cameraInput.open();
    // 配置会话和输出流,这里就省略具体会话逻辑了
    // ...
  } catch (error) {
    console.error(`Camera setup failed: ${JSON.stringify(error)}`);
  }
}

二、CameraType枚举含义 CAMERA_TYPE_WIDE_ANGLE:广角镜头(主摄) CAMERA_TYPE_ULTRA_WIDE:超广角镜头 CAMERA_TYPE_TELEPHOTO:长焦镜头

你好,在HarmonyOS 5(API 12以上)上,相机框架已经把物理镜头拆成独立的 CameraDevice,并给每个设备打上了 cameraType 标签

CAMERA_TYPE_WIDE_ANGLE (1) 指 主摄广角 CAMERA_TYPE_ULTRA_WIDE (2) 指 超广角 CAMERA_TYPE_TELEPHOTO (3)  指 长焦

在HarmonyOS鸿蒙Next中,通过CameraKit接口指定摄像头。使用getCameras()获取设备摄像头列表,筛选所需摄像头类型(如前置或后置)。创建CameraInput实例时传入对应cameraId完成指定。

在HarmonyOS Next中,cameraManager.getSupportedCameras() 可以获取设备支持的所有物理摄像头列表,包括主摄、广角、长焦等。每个摄像头都对应一个 Camera 对象,包含其类型信息。

通过 cameraManager.createCameraInput(camera) 可以指定使用特定摄像头,例如长焦摄像头。你需要先遍历支持的摄像头列表,筛选出 CameraTypeCAMERA_TYPE_TELEPHOTO 的摄像头,然后将其作为参数传入。

CameraType 中的枚举值含义如下:

  • CAMERA_TYPE_WIDE_ANGLE:主广角摄像头
  • CAMERA_TYPE_ULTRA_WIDE:超广角摄像头
  • CAMERA_TYPE_TELEPHOTO:长焦摄像头

示例代码:

let cameras = cameraManager.getSupportedCameras();
let teleCamera = cameras.find(camera => camera.cameraType === camera.CameraType.CAMERA_TYPE_TELEPHOTO);
if (teleCamera) {
    let cameraInput = cameraManager.createCameraInput(teleCamera);
    // 后续配置和使用
}

注意先检查设备是否支持该类型摄像头,避免异常。

回到顶部