繁体   English   中英

拍照Android相机应用后延迟

[英]Delay after taking photo Android camera app

我正在创建一个基本的相机应用程序,作为一个小项目,旨在开始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() {

}
  1. 您无需在stopPreview()之后调用takePicture() 并且您不需要在下一行上使用startPreview() 如果您希望在将图片捕获到Jpeg流中后重新启动实时预览,则确实需要onPictureTaken()回调内部使用startPreview() (而不是在发布的代码中在onClick()中使用!!)

  2. 为了在使用相机时保持UI响应速度,应在后台线程上使用相机进行所有操作。 但是,仅在某些后台线程上调用Camera.open()Camera.close()是不够的。 您必须创建一个Handler线程,并将其用于Camera.open() 相同的Looper将用于所有相机回调,包括PictureCallback.onPictureTaken() 请参阅我有关HandlerThread用法的详细演练

  3. 正如我在其他地方解释的那样 ,如果在完全支持该API的设备上使用新的camera2 API,则可以实现更好的性能(但对于仅提供LEGACY级别的camera2支持的设备,最好使用旧的API)。

但是,如果您想从摄像机ISP获得最大收益,这种冻结可能是不可避免的(这取决于制造商做出的许多硬件和固件设计选择) 一些巧妙的UI调整可能有助于掩盖此效果。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM