gpt4 book ai didi

java - Camera.takePicture() 之后没有调用任何回调

转载 作者:太空宇宙 更新时间:2023-11-04 14:33:31 28 4
gpt4 key购买 nike

按照 Android API 文档给出的步骤进行操作后,我在调用 Camera.takePicture() 后没有收到任何回调(没有快门回调或图像回调)。我拥有 list 中声明的​​正确权限,没有遇到任何异常,并且我可以使用此代码来录制视频。与此问题类似的问题只是关于未调用 Camera.PictureCallback ,但我没有发现任何未调用 Camera.ShutterCallback 的问题。这是我的代码:

    private class CameraPreview extends SurfaceView implements SurfaceHolder.Callback,
Camera.PictureCallback, Camera.ShutterCallback {

protected SurfaceHolder mHolder;

@SuppressWarnings("deprecation")
public CameraPreview() {
super(VideoActivity.this);
mHolder = getHolder();
mHolder.addCallback(this);
// Deprecated setting is required for API < 11
// Automatically set for API >= 11, no issue with continuing to use it
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.d(TAG, "Surface is created");
try {
mCamera = getCamera();
Log.d(TAG, "Camera created when surface was created");
if(mCamera != null) {
mCamera.lock();
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPictureFormat(ImageFormat.JPEG);
mCamera.setParameters(parameters);
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
Log.d(TAG, "Preview Started");
}
} catch(IOException e) {
Log.e(TAG, "IOException in setting camera preview: " + e.getMessage(), e);
}
}

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

@Override
public void surfaceDestroyed(SurfaceHolder holder) { }

@Override
public void onPictureTaken(byte[] data, Camera camera) {

Log.d(TAG, "onPictureTaken called");
File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
if(pictureFile == null) {
Log.e(TAG, "Error creating media file");
return;
}
Log.d(TAG, "Writing to file: " + pictureFile);

try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
Log.e(TAG, "File not found: " + e.getMessage());
} catch (IOException e) {
Log.e(TAG, "Error accessing file: " + e.getMessage());
}

}

@Override
public void onShutter() {
Log.d(TAG, "onShuttter is called");
}
}

该类的实例在 onStart() 中初始化,并存储在名为 mPreview 的实例变量中。 mPreview 实现了 Camera 回调接口(interface),因此我可以通过这种方式使用它们。 CameraPreview 类一直用于录制视频。拍照逻辑:

mCamera.lock();
mCamera.takePicture(mPreview, null, mPreview);
Toast.makeText(VideoActivity.this, "Picture Taken",
Toast.LENGTH_SHORT).show();
Log.d(TAG, "Picture Taken");

所以我的问题是,为什么我没有收到任何回调?

最佳答案

我不久前就发现了这个问题,但忘了分享,所以这里是:

我需要在mCamera.startPreview()之后和mCamera.takePicture()之前调用mCamera.reconnect()。我相信这是因为我正在接收来自另一个进程的回调来拍照,并且在另一个进程使用相机后需要调用重新连接。

关于java - Camera.takePicture() 之后没有调用任何回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25852173/

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