【问题标题】:SurfaceView getting black when calling Camera.stopPreview()调用 Camera.stopPreview() 时 SurfaceView 变黑
【发布时间】:2011-08-23 19:05:01
【问题描述】:
我正在对相机捕获的预览进行一些图像处理。这是消耗 CPU 的任务,我必须停止预览以使其更快。在处理新帧之前,我调用 Camera.stopPreview() 和 Camera.startPreview() 之后。
但是,我希望在停止预览后将最后捕获的帧显示在 SurfaceView 上。它在 2.3 设备上“开箱即用”,但是,在旧版本的 SDK 上调用 Camera.stopPreview() 后,SurfaceView 变黑。有谁知道发生了什么变化以及该怎么办?
【问题讨论】:
标签:
android
android-camera
【解决方案1】:
是的,这是对 2.3 的改进。
我在 2.2 中也遇到过这个问题,尽管根据 API 在理论上这是可能的,但无法处理预览图像。为了解决这个问题,我必须使用Camera.takePicture(null, null, Camera.PictureCallback myCallback)(参见信息here)实际拍照,然后实现回调来处理拍摄的照片。实现这个回调的类的实例其实就是传递给Camera.takePicture()的参数,而回调方法本身是这样的:
public void onPictureTaken(byte[] JPEGData, Camera camera) {
final Bitmap bitmap = createBitmapFromView(JPEGData);
// do something with the Bitmap
}
这样做可以防止将照片与使用相机应用程序拍摄的常规照片一起保存在外部存储设备上。如果您需要序列化Bitmap,您必须明确地进行。但这并不妨碍发出相机的触发声音。
Camera.takePicture() 必须在预览运行时调用。之后可以直接调用stopPreview()。
注意 /!\:
Camera.takePicture() (根本)不可重入。回调必须在任何后续调用 Camera.takePicture() 之前返回。这冻结了我的手机,我必须关闭并重新启动它才能再次使用。由于该操作是由按钮触发的,所以在我这边,我不得不用一个布尔值来屏蔽它:
if (!mPictureTaken) {
mPictureTaken = true; // absolutely NOT reentrant. Any double click sticks the phone otherwise.
mCameraView.takePicture(callback);
}