HarmonyOS折叠屏镜头切换应用实践

描述

在2025华为开发者大会的图片和相机分论坛上,美颜相机分享了如何通过折叠屏镜头适配,打造多端一致的拍摄体验。随着华为折叠屏产品的不断丰富,相机开发在折叠屏上也面临独特技术难题,镜头选错导致黑屏、角度设置错误导致拉伸或者画面旋转的问题日益凸显。本文通过镜头选取、镜头接续、角度设置三个维度来探讨在HarmonyOS折叠屏设备上更多创新的使用方式和更丰富的布局样式。

统一、简易的镜头选取

HarmonyOS基于折叠状态和镜头位置,精准描述每一颗镜头,并仅上报当前折叠状态下的前后置镜头集合。这种机制确保了应用能够按照直板机镜头的使用习惯,直接通过位置信息打开镜头,而HarmonyOS会自动映射为当前折叠状态下的镜头。这种设计保障了直板机和折叠机在镜头使用上的统一性和兼容性,极大简化了开发者的适配工作。

折叠屏

 

import { camera } from '@kit.CameraKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';
function getCameraManager(context: common.BaseContext): camera.CameraManager {
  let cameraManager: camera.CameraManager = camera.getCameraManager(context);
  return cameraManager;
}
function getCameraDevices(cameraManager: camera.CameraManager): Array {
  let cameraArray: Array = cameraManager.getSupportedCameras();
  if (cameraArray != undefined && cameraArray.length > 0) {
    for (let index = 0; index < cameraArray.length; index++) {
      console.info('cameraId : ' + cameraArray[index].cameraId); // 相机ID
      console.info('cameraPosition : ' + cameraArray[index].cameraPosition); // 相机位置
      console.info('cameraType : ' + cameraArray[index].cameraType); // 相机类型
      console.info('connectionType : ' + cameraArray[index].connectionType); // 相机连接类型
    }
    return cameraArray;
  } else {
    console.error("cameraManager.getSupportedCameras error");
    return [];
  }
}

 

快捷的镜头切换方式

折叠设备形态各异,在相机应用的开发过程中需要统一的摄像头切换方案,以确保用户在拍照、录像过程中获得更好的体验。为了应对折叠屏设备的动态变化,HarmonyOS提供了两种镜头切换方式,以满足不同场景的需求:

方式1:应用自主切换镜头

适用场景:适用于需要精致拍照体验的场景,如美颜相机。

实现方式:应用需监听折叠状态的变化,自主完成镜头的启停、切换,重新配置会话(涉及修改分辨率),重新查询镜头能力范围,并调整UX布局。

优势:提供高度定制化的拍摄体验,满足复杂场景的需求。

 

import { camera } from '@kit.CameraKit';
import { BusinessError } from '@kit.BasicServicesKit';
function registerFoldStatusChanged(err: BusinessError, foldStatusInfo: camera.FoldStatusInfo) {
  console.info('foldStatusChanged foldStatus: ' + foldStatusInfo.foldStatus);
    for (let i = 0; i < foldStatusInfo.supportedCameras.length; i++) {
      // 选取当前折叠状态的前置镜头,进行重新配流和UX布局调整
      console.info(`foldStatusChanged camera[${i}]: ${foldStatusInfo.supportedCameras[i].cameraId}`);
    }
}
function onFoldStatusChange(cameraManager: camera.CameraManager) {
  cameraManager.on('foldStatusChange', registerFoldStatusChanged);
}
function offFoldStatusChange(cameraManager: camera.CameraManager) {
  cameraManager.off('foldStatusChange', registerFoldStatusChanged);
}

 

 

方式2:系统自动切换镜头

适用场景:适用于简单场景,如人脸识别。

实现方式:HarmonyOS自动完成镜头切换、会话配置,应用使能自动切换镜头的能力时,在有多个前置镜头的折叠设备上,不同的折叠状态下可自动切换到当前可使用的前置镜头,避免前置镜头被折入内部导致黑屏。

优势:简化开发流程,提升用户体验的一致性和便捷性。

 

import { camera } from '@kit.CameraKit';
function enableAutoDeviceSwitchFn(session: camera.PhotoSession) {
  if (session.isAutoDeviceSwitchSupported()) {
    session.enableAutoDeviceSwitch(true);
  }
}

 

简单易用的角度查询设置能力

为了确保在不同折叠状态下拍摄的照片和视频保持正确的方向和角度,HarmonyOS相机采用了以下角度计算公式:

预览:屏幕跟随镜头一起旋转,因此预览角度需考虑屏幕旋转角度。

公式:旋转角度 = 镜头安装角度 + 屏幕旋转角度

拍照/录像:要保证照片/视频正向存储,因此与设备旋转角度相关。

公式:旋转角度 = 前置:镜头安装角度 – 设备旋转角度

后置:镜头安装角度 + 设备旋转角度

通过这些角度计算,美颜相机确保了在不同折叠状态下,用户能够获得一致且高质量的拍摄体验。

 

import { camera } from '@kit.CameraKit'; 
import { BusinessError } from '@kit.BasicServicesKit';
import { display } from '@kit.ArkUI'; 
// 以预览举例,previewOutput是创建的预览输出
let initDisplayRotation = display.getDefaultDisplaySync().rotation;
let initPreviewRotation = previewOutput.getPreviewRotation(initDisplayRotation * camera.ImageRotation.ROTATION_90);
previewOutput.setPreviewRotation(initPreviewRotation, false);
display.off('change');
display.on('change', () => {
  // 在折叠状态变化时,重新查询旋转角度并下发
  initDisplayRotation = display.getDefaultDisplaySync().rotation;
  let imageRotation = initDisplayRotation * camera.ImageRotation.ROTATION_90;
  let previewRotation = previewOutput.getPreviewRotation(imageRotation);
  previewOutput.setPreviewRotation(previewRotation, false);
});

 

开发者可通过HarmonyOS开发者官网查询相关资料进行开发实践,通过以下官网链路进行体验参考(指南→媒体→相机服务→开发相机应用),助力开发更高效便捷。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分