近期拿了一台 华为mate20 Pro的手机,在运行AR示例的过程中出现了黑屏。
问题排查
SDK版本:com.huawei.hms:arenginesdk:3.7.0.3
定位
经排查,发现(ARCamera对象的相机内参) getImageDimensions()返回的图像尺寸的width和height都为0。
这里的期望结果是 1440 x 1080。
API参考
查阅API参考,发现文档中关于getImageDimensions的描述中,新增以下注意事项:
转至setPreviewSize()方法描述。
解决方法
修改
根据API文档的描述,在ARConfigBase创建的地方,调用了config.setPreviewSize(1440,1080);
但是在后续的步骤中,仍然无法通过getImageDimensions()方法获取到width、height的有效值。
思考
此前开发用的Huawei Mate 20
,AR示例运行正常。
这款设备既支持ARCore,又支持AREngine。2018年->2020年期间,华为发布的手机大都支持ARCore。
现使用Mate 20 Pro
,出现黑屏问题。
猜想
这可能跟设备有关,支持的设备列表中的设备都是经过验证的。其它机型或许会有问题。
并未在AREngine的支持设备列表中,找到’Mate 20 Pro’这型号。
AR Engine支持的设备列表
最终办法
设置输入预览流分辨率,默认分辨率为(1440x1080),若某些机型在后续的步骤中,无法通过ARCameraIntrinsics对象获取相机尺寸,那就赋默认值。
ARConfig创建
config = new ARWorldTrackingConfig(session);
//设置输入预览流分辨率,默认分辨率为(1440x1080)
//此外还支持宽高比为4:3的物理相机预览分辨率。
config.setPreviewSize(1440,1080);
Texture初始化时
ARCamera arCamera = frame.getCamera();
ARCameraIntrinsics intrinsics = arCamera.getCameraImageIntrinsics();
int[] dimensions = intrinsics.getImageDimensions();
int width ,height ;
if (ARPlatForm.isArCore()){
width = dimensions[0];//1440;
height = dimensions[1];//1080;
}else{
if (dimensions[0] == 0 && dimensions[1] == 0){
width = 1440;
height = 1080;
}else {
width = Math.max(dimensions[1],dimensions[0]);
height = Math.min(dimensions[1],dimensions[0]);
}
}
cameraTexture = new ExternalTexture(cameraTextureId, width, height);