Android Camera2 API预览有时会失真

时间:2017-04-10 09:20:22

标签: android preview android-camera2 distortion camera2

我正在使用Camera2 API构建自定义相机。 到目前为止,除了有时会扭曲的预览外,相机的效果非常好。假设我连续7次打开相机。所有尝试都是成功的,第8次相机预览失真。看起来它使用宽度作为高度,反之亦然。

我的代码基于camera2的Google示例实现,可以找到here。 有趣的是,即使是Google示例实现,有时也会出现这种扭曲的预览。我试图修改AutoFitTextureView但没有成功。我目前正在使用Google再次提供的AutoFitTextureView.java。

此帖can be found here的类似帖子。 但是,提议的修复程序并没有解决问题。

我可以通过更改setUpCameraOutputs方法中的以下内容来重现该问题:

mTextureView.setAspectRatio(mPreviewSize.getHeight(), mPreviewSize.getWidth());

为:

mTextureView.setAspectRatio(mPreviewSize.getWidth(), mPreviewSize.getHeight());

另一个奇怪的事情是,每当发生扭曲的预览并且您只需按下主页按钮以便应用程序进入onPause()并再次打开应用程序以便调用onResume(),每次预览都是完美的。

这里有没有人遇到过这个问题并找到了解决方法?

提前致谢

2 个答案:

答案 0 :(得分:1)

我在Sony Xperia Z3 Tablet Compact上面临同样的问题。

Alex指出的拉动请求似乎对我没用。这会导致相机预览大于视图区域(预览被裁剪)。

虽然我无法专门跟踪问题,但我找到了解决方法。在打开相机的过程中,当mTextureView的尺寸发生变化时,似乎发生了失真。延迟相机打开程序可以解决问题。

修改了openCamera方法:

/**
 * Opens the camera specified by {@link StepFragmentCamera#mCameraId}.
 */
private void openCamera(int width, int height) {
    startBackgroundThread();

    if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA)
            != PackageManager.PERMISSION_GRANTED) {
        requestCameraPermission();
        return;
    }
    setUpCameraOutputs(width, height);
    configureTransform(width, height);

    /*
     * Delay the opening of the camera until (hopefully) layout has been fully settled.
     * Otherwise there is a chance the preview will be distorted (tested on Sony Xperia Z3 Tablet Compact).
     */
    mTextureView.post(new Runnable() {
        @Override
        public void run() {
            /*
             * Carry out the camera opening in a background thread so it does not cause lag
             * to any potential running animation.
             */
            mBackgroundHandler.post(new Runnable() {
                @Override
                public void run() {
                    Activity activity = getActivity();
                    CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
                    try {
                        if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) {
                            throw new RuntimeException("Time out waiting to lock camera opening.");
                        }
                        manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler);
                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    } catch (InterruptedException e) {
                        throw new RuntimeException("Interrupted while trying to lock camera opening.", e);
                    }
                }
            });
        }
    });
}

答案 1 :(得分:0)

Google Camera2Basic示例was finally fixed。原始代码有一个微小的< vs >错误。这是错误的2年。