gpt4 book ai didi

java - Android 相机应用拍照后延迟

转载 作者:行者123 更新时间:2023-12-02 10:52:28 28 4
gpt4 key购买 nike

我正在创建一个基本的相机应用程序,作为我正在做的一个小项目,以开始 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. 您无需在 takePicture() 之后调用 stopPreview()。并且下一行不需要 startPreview() 。您do need onPictureTaken() 回调中的 startPreview() (不是在发布的代码中的 onClick() 中!!) 如果您希望在将图片捕获到 Jpeg 流后重新启动实时预览。

  2. 为了在使用相机时保持 UI 响应能力,您应该在后台线程上完成所有使用相机的工作。但在某些后台线程上调用Camera.open()Camera.close()是不够的。您必须创建一个处理程序线程并将其用于Camera.open()。相同的 Looper 将用于所有相机回调,包括 PictureCallback.onPictureTaken()。看我的detailed walkthrough关于HandlerThread的使用。

  3. 正如我explained elsewhere ,如果您使用新的camera2,您可以获得更好的性能在完全支持此 API 的设备上使用 API(但最好在仅提供旧版 Camera2 支持的设备上使用旧 API)。

但是,如果您想从相机 ISP 中获得最大 yield ,这种卡住可能不可避免(这取决于制造商做出的许多硬件和固件设计选择)嗯>。一些巧妙的 UI 调整可能有助于隐藏这种效果。

关于java - Android 相机应用拍照后延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52061935/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com