gpt4 book ai didi

android - 如何使用新的 android.hardware.camera2 API 显示相机预览?

转载 作者:行者123 更新时间:2023-11-29 02:17:43 24 4
gpt4 key购买 nike

我想用 android.hardware.camera2 api 替换已弃用的相机 api。 github 上的示例项目显示了相机图片,但如果设备的分辨率与相机缩放选项不匹配,则会在屏幕边缘创建黑色条纹。我已经在模拟器(Android 26-29,Nexus 2)上试过了。与三星设备 SM-T395 和 SM-T585 上的结果相同。在全高清上这很奇怪。

增加 MAX_PREVIEW_HEIGHTMAX_PREVIEW_WIDTH 没有帮助。我想我需要采取

这里是模拟器的一些示例图片:

Custom resolution with quite a good  fit FullHD sample

如何在自定义大小的预览中显示相机的预览?

最佳答案

这个问题在很大程度上取决于设备。每个供应商为其相机设置和支持的分辨率列表。此外,预览和实际图像捕获可能会有所不同(很少但仍然如此)。如果您不想扭曲和扭曲您的图像和预览,您不能超出此列表。

但并不是所有的事情都那么令人沮丧。通常在这个列表中有几个支持的分辨率,其纵横比与手机屏幕相同(或者至少会在图像的顶部或底部添加黑色空间,但不会在侧面添加黑色空间)

所以我建议的是找到屏幕的纵横比(TextureView/SurfaceView)。为您的相机计算所有支持的预览纵横比。比较这些比率并选择与屏幕(TextureView/SurfaceView)比率相同但分辨率最大的比率。对于可能在顶部或底部显示黑色空间但在侧面不显示黑色空间的分辨率,您可能会实现类似的效果。

这是一个示例代码,它做类似的事情,但方式有点不同。

//Create TextureView & TextureView surfaceTextureListener
private TextureView mTextureView;
private TextureView.SurfaceTextureListener mSurfaceTextureListener =
new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
setupCamera(width, height);
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
};
//Implement Activity onResume
@Override
public void onResume() {
super.onResume();
if(mTextureView.isAvailable()) {
} else {
mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
}
}
//Get surface preview sizes & camera Id
private void setupCamera(int width, int height) {
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
for(String cameraId : cameraManager.getCameraIdList()) {
CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
if(cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) ==
CameraCharacteristics.LENS_FACING_FRONT){
continue;
}
StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
mPreviewSize = getPreferredPreviewSize(map.getOutputSizes(SurfaceTexture.class), width, height);
mCameraId = cameraId;
return;
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
private Size getPreferredPreviewSize(Size[] mapSizes, int width, int height) {
List<Size> collectorSizes = new ArrayList<>();
for(Size option : mapSizes) {
if(width > height) {
if(option.getWidth() > width &&
option.getHeight() > height) {
collectorSizes.add(option);
}
} else {
if(option.getWidth() > height &&
option.getHeight() > width) {
collectorSizes.add(option);
}
}
}
if(collectorSizes.size() > 0) {
return Collections.min(collectorSizes, new Comparator<Size>() {
@Override
public int compare(Size lhs, Size rhs) {
return Long.signum(lhs.getWidth() * lhs.getHeight() - rhs.getWidth() * rhs.getHeight());
}
});
}
return mapSizes[0];
}

取自here

希望对您有所帮助。

关于android - 如何使用新的 android.hardware.camera2 API 显示相机预览?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59262779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com