拍摄Android相机应用后延迟

问题描述 投票:0回答:2

我正在创建一个基本的相机应用程序,作为我开始使用Android开发的一个小项目。

当我点击按钮拍照时,大约有1秒的延迟,预览会在再次解冻之前冻结。崩溃没有问题 - 只是冻结问题。为什么会发生这种情况,我该如何解决?

下面是实例化相机的方法,以及我的SurfaceView类。

 private void startCamera() {

    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    cameraPreviewLayout = (FrameLayout) findViewById(R.id.camera_preview);

    camera = checkDeviceCamera();
    camera.setDisplayOrientation(90);

    mImageSurfaceView = new ImageSurfaceView(MainActivity.this, camera);
    cameraPreviewLayout.addView(mImageSurfaceView);

    ImageButton captureButton = (ImageButton)findViewById(R.id.imageButton);
    captureButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            camera.takePicture(null, null, pictureCallback);
            camera.stopPreview();
            camera.startPreview();
        }
    });
}

public class ImageSurfaceView extends SurfaceView implements 

SurfaceHolder.Callback {
    private Camera camera;
    private SurfaceHolder surfaceHolder;

    public ImageSurfaceView(Context context, Camera camera) {
        super(context);
        this.camera = camera;
        this.surfaceHolder = getHolder();
        this.surfaceHolder.addCallback(this);

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {
                this.camera.setPreviewDisplay(holder);
                this.camera.startPreview();
                this.camera.setDisplayOrientation(90);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }


}

编辑:pictureCallback目前没有任何内容。

Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {

}
java android android-camera
2个回答
1
投票
  1. 你不需要在stopPreview()之后调用takePicture()。而你下一行不需要startPreview()。如果你想在将图片捕获到Jpeg流中之后重新启动实时预览,那么你在do need回调中的startPreview() onPictureTaken()(不像在发布的代码中那样在onClick() !!)
  2. 为了在使用相机时保持UI响应,您应该在后台线程上使用相机完成所有工作。但是在某些背景线上调用Camera.open()Camera.close()是不够的。您必须创建一个Handler线程并将其用于Camera.open()。相同的Looper将用于所有相机回调,包括PictureCallback.onPictureTaken()。请参阅我的detailed walkthrough关于HandlerThread的使用。
  3. 正如我explained elsewhere,如果您在完全支持此API的设备上使用新的camera2 API,您可以获得更好的性能(但最好将旧API用于仅提供LEGACY级别的camera2支持的设备)。

但是如果你想从相机ISP获得最大化,这种冻结可能是不可避免的(这取决于许多硬件和固件设计选择,由制造商制造)。一些聪明的UI调整可能有助于隐藏这种效果。


0
投票

您需要启用对Android手机上隐藏的“开发者选项”菜单的访问权限。为此,只需点按“设置”中的“关于手机”选项即可。然后点击“Build number”七次,你就完成了。现在,您只需返回主设置菜单,就可以在列表底部附近找到开发人员选项。

==>现在你完成了那部分,让真正的乐趣开始吧。点击刚启用的新开发者选项菜单,然后滚动,直到看到以下三个设置(请注意,它们可能位于“高级”子部分中):

窗口动画比例过渡动画比例Animator动画比例

==>你看到了吗?默认情况下,这三个选项中的每一个都设置为“1x”,但点击它们并将其更改为“.5x”将大大加快您的手机速度。这种无害的调整迫使设备加速所有过渡动画,因此整个用户体验更快更顺畅

© www.soinside.com 2019 - 2024. All rights reserved.