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

标签 android scaling android-camera2

我想用 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/

相关文章:

javascript - 缩放 html Canvas (html/reactjs)

java - 接收 CameraAccessException : CAMERA_ERROR (3) on CaptureSession. setRepeatingRequest()

android - 如何在 camera2 api,android 中锁定焦点?

java - Zxing 二维码扫描仪自动关闭冲洗灯

android - 如何播放从 Android 设备流式传输到服务器的视频?

java - imread 没有从 Linux 读取 Java Android 上的现有图像

html - 缩放背景图像,使其始终保持纵横比并居中

android - 如何使用 overridePendingTransition() 动画覆盖 onBackPressed()

android - Ready XML 数据库或将其转换为 SQLite 哪个更好?我可以将转换后的 SQLite 数据库放在 package(.apk) 上吗?

html - Phonegap Scaling 困惑和字体大小缩放