Предварительный просмотр SurfaceView, показывающий моно chrome вид в Xiaomi Mi A1 - PullRequest
0 голосов
/ 10 марта 2020

Я создаю камеру SurfaceView для захвата изображения с помощью API камеры. Коды работают нормально на большинстве устройств. Тем не менее, в устройстве Xiaomi, особенно Xiaomi Mi A1. Вот проблемы, с которыми я столкнулся с Mi A1:

  1. Экран предварительного просмотра показывает моно chrome предварительный просмотр;
  2. Неправильный размер изображения, возвращаемого устройством (320 * 240).

Ниже приведен снимок моего кода:

@Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        surfaceHolder.setFormat(PixelFormat.TRANSPARENT);

        if (mCamera != null) {
            setCameraDisplayOrientation();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
        surfaceHolder.setFormat(PixelFormat.TRANSPARENT);

        if(mCamera != null) {
            try{
                Camera.Parameters parameters = mCamera.getParameters();

                mCamera.setPreviewDisplay(surfaceHolder);
                parameters.setFocusMode(parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
                parameters.setColorEffect(Camera.Parameters.EFFECT_NONE);
                parameters.setZoom(0);

                List<Size> supportPictureSizes = parameters.getSupportedPictureSizes();

              parameters.setPictureSize(supportPictureSizes.get(0).width,supportPictureSizes.get(0).height);

                requestLayout();
                mCamera.setParameters(parameters);
                mCamera.startPreview();
                isSafeToTakePhoto = true;
                previewing = true;

                setCameraDisplayOrientation();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        // Surface will be destroyed when we return, so stop the preview
        surfaceHolder.removeCallback(this);

        if (mCamera != null){
            mCamera.stopPreview();
        }
        previewing = false;
    }

Кроме того то, что метод ниже использует для расчета оптимального размера предварительного просмотра:

private Camera.Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
        final double ASPECT_TOLERANCE = 0.1;
        double targetRatio = (double) w / h;
        if (sizes == null) return null;

        Camera.Size optimalSize = null;
        double minDiff = Double.MAX_VALUE;

        int targetHeight = h;

        // Try to find an size match aspect ratio and size
        for (Camera.Size size : sizes) {
            double ratio = (double) size.width / size.height;
            if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
                continue;
            if (Math.abs(size.height - targetHeight) < minDiff) {
                optimalSize = size;
                minDiff = Math.abs(size.height - targetHeight);
            }
        }

        // Cannot find the one match the aspect ratio, ignore the requirement
        if (optimalSize == null) {
            minDiff = Double.MAX_VALUE;
            for (Camera.Size size : sizes) {
                if (Math.abs(size.height - targetHeight) < minDiff) {
                    optimalSize = size;
                    minDiff = Math.abs(size.height - targetHeight);
                }
            }
        }
        return optimalSize;
    }

Чтобы исправить моно chrome предварительного просмотра, я добавил parameters.setColorEffect(Camera.Parameters.EFFECT_NONE);, но это ничего не влияет.

Я также подозреваю, что причиной root могут быть проблемы с разрешениями, в которых устройство Xiaomi имеет конфигурацию, отличную от конфигурации другого производителя.

Я с нетерпением жду решения и обсуждения для решения вышеуказанных вопросов. Заранее спасибо.

...