Java Google Vision:setRequestPreviewSize无效

Java Google Vision:setRequestPreviewSize无效,java,android,android-camera,google-vision,Java,Android,Android Camera,Google Vision,我正在使用Google Vision API开发一个带有嵌入式二维码扫描仪的Android应用程序。扫描仪正常工作,但充当摄影机预览的SurfaceView垂直拉伸。不同仿真设备的失真程度不同 据我所知,您可以使用mCameraSource.setRequestedPreviewSize(w,h)来设置正确的大小w和h我分别设置为Resources.getSystem().getDisplayMetrics().widthPixels和Resources.getSystem().getDispl

我正在使用Google Vision API开发一个带有嵌入式二维码扫描仪的Android应用程序。扫描仪正常工作,但充当摄影机预览的SurfaceView垂直拉伸。不同仿真设备的失真程度不同

据我所知,您可以使用
mCameraSource.setRequestedPreviewSize(w,h)
来设置正确的大小
w
h
我分别设置为
Resources.getSystem().getDisplayMetrics().widthPixels
Resources.getSystem().getDisplayMetrics().heightPixels
。然而,我注意到,无论我解析为宽度和高度的数字是什么,它的显示方式都没有变化

但是,调整其显示的SurfaceView的大小确实会对失真产生影响。对于一个特定的模拟Android设备,我可以静态地设置正确的宽度和高度。然而,对于不同的设备,像素w:h比稍有不同,失真可能会变得相当大

我读过关于StackOverflow的各种解决方案,但大多数都使用
CameraPreview
而不是
CameraSource.Builder

到目前为止,我的代码是(ScannerActivity.java的一部分):

我用以下参数设置
SurfaceView
的大小:

svCamera.setLayoutParams(new RelativeLayout.LayoutParams(width, width/9*16));

如果我记得的话,我会将其更新为非硬编码版本。

恰恰相反。您不能为
setRequestedPreviewSize()
选择任意分辨率。这个CameraSourceAPI包装了普通的CameraAPI,它只公开一些“支持的”宽度和高度对

如果要不失真地显示实时视图,必须将SurfaceView设置为与所选摄影机预览的纵横比匹配。这意味着,相机640x480可以使用320x240像素的表面。对于1920x1080相机,使用1280x720的表面也可以


但是,如果您的1280x720相机的表面为800x480(并且如果您的设备支持这种相机分辨率),图片将略微拉伸。

干杯,您已经帮助我修复了它。我用我的(临时)修正更新了这个问题。感谢您的快速回复!
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int width = displayMetrics.widthPixels;    
int height = displayMetrics.heightPixels;
...
cameraSource.setRequestedPreviewSize(1280, 720); // Hardcoded, for now.
svCamera.setLayoutParams(new RelativeLayout.LayoutParams(width, width/9*16));