HarmonyOS鸿蒙Next中折叠屏中途进入拍照页面,摄像头显示画面方向有问题??
HarmonyOS鸿蒙Next中折叠屏中途进入拍照页面,摄像头显示画面方向有问题??
问题现象
在折叠屏上不同折叠状态下很明显的摄像头显示画面不对,在中途折叠,横着进去再旋转/翻折,竖着进去再旋转/翻折,画面的方向就不对
代码信息
不涉及
问题日志
不涉及
版本信息
xts:系统版本6.0.0、软件版本:6.0.0.130 SP18 X5:系统版本4.2.0
相机库:https://gitcode.com/openharmony-tpc/flutter_packages/tree/br_camera-v0.11.0+2_ohos/packages/camera
更多关于HarmonyOS鸿蒙Next中折叠屏中途进入拍照页面,摄像头显示画面方向有问题??的实战教程也可以访问 https://www.itying.com/category-93-b0.html
开发者你好,
可否提供复现问题的录屏,以及flutter版本。
更多关于HarmonyOS鸿蒙Next中折叠屏中途进入拍照页面,摄像头显示画面方向有问题??的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
鸿蒙Next中折叠屏拍照方向问题通常由屏幕状态识别异常导致。系统未正确获取折叠角度或内外屏切换状态,造成摄像头画面方向与传感器数据不匹配。需检查系统服务中折叠状态监听模块的实时性,并验证相机服务是否同步更新了屏幕方向参数。
这是一个典型的折叠屏设备上相机画面方向与设备物理姿态不匹配的问题。问题的核心在于应用没有正确处理设备折叠状态、屏幕方向与相机传感器方向之间的动态关系。
在HarmonyOS Next中,折叠屏的形态变化(如展开、折叠、旋转)会触发display和window的变更事件。相机画面方向错误通常是因为:
- 相机预览方向未动态更新:当折叠状态改变时,应用的
Window或Display方向可能发生了变化,但相机预览的Surface没有相应地请求新的旋转角度。 - 未监听关键的设备事件:应用可能没有正确监听或响应
display的foldStatusChange(折叠状态变化)和orientationChange(方向变化)事件,或者window的windowSizeChange(窗口大小变化)事件。
解决思路如下:
1. 获取并监听设备状态:
- 使用
display.getDefaultDisplay()获取默认Display对象。 - 监听
Display的'foldStatusChange'和'orientationChange'事件。 - 同时,也需要监听
Window的'windowSizeChange'事件,因为折叠操作会直接改变窗口的尺寸和可用区域。
2. 动态计算并设置相机预览方向:
- 在事件回调中,需要重新计算相机预览的正确方向。关键方法是
camera.CameraOutputCapability.getSupportedPreviewOutputSizes()和创建PreviewOutput时设置的rotation参数。 - 计算
rotation时,必须综合考虑:- 设备自然方向:通过
display.orientation获取。 - 相机传感器方向:这是一个固定的硬件特性,通过
camera.CameraDevice.cameraPosition等信息可以推断或查询。 - 应用UI的当前方向:尤其是当应用固定了方向时。
- 设备自然方向:通过
- 核心逻辑是:相机预览的
rotation= (相机传感器方向 + 设备当前显示方向补偿值) % 360。这个补偿值需要根据设备的折叠状态(是外折、内折、还是展开)和当前握持方向动态计算。
3. 重建相机预览输出(关键步骤):
- 在方向或折叠状态发生重大变化(例如从竖屏折叠变为横屏展开)时,仅仅更新
rotation值可能不够。最可靠的方式是:- 停止当前的相机数据流。
- 释放原有的
PreviewOutput。 - 根据新的窗口尺寸(
windowSizeChange事件提供)和计算出的新rotation值,重新创建PreviewOutput。 - 将新的
PreviewOutput重新添加到相机会话中并启动数据流。
针对您提到的“中途进入”场景: 应用在创建时可能处于一种折叠状态,进入相机页面后,系统会基于当时的窗口状态初始化相机预览。如果在预览过程中折叠状态改变,而应用没有执行上述的监听和重建流程,那么预览画面就会“冻结”在旧的方向上,导致与当前设备物理方向不符。
总结:
此问题并非系统BUG,而是应用开发中需要为折叠屏设备特别处理的兼容性场景。开发者需要在相机模块中,加强对Display和Window相关状态变化的监听,并在回调中动态地、正确地重新计算预览方向,必要时重建预览输出流,才能保证相机画面在所有折叠形态和旋转状态下都能正确显示。

