Android Camera.takePicture()有时不返回?

时间:2011-10-02 17:15:26

标签: android android-camera

我正在编写一个Android应用程序来拍照。代码在onPreviewFrame(byte []数据,Camera camera)中从预览中获取帧后进行一些处理。 问题是android.hardware.Camera的函数takePicture()有时会完全按照我想要的方式执行,有时不会返回,也不会调用任何回调。当我运行应用程序时,第一张照片不会返回,有时我可以拍摄四张照片而第五张会导致应用程序挂起。有一个类似线程:problem with taking pictures using the android camera。建议的解决方案是使用上次预览的框架,但肯定不是一个好的解决方案!这个问题可能会引发因为takePicture是Asancronous(Android Doc)。

我只需调用takePicture()函数:

public static void takePicture() {
   mCamera.takePicture(null, null, jpegCallback);
}

Here是Logcat输出的链接。您可以使用短语“takePicture”在输出中搜索,您将看到此函数有时会返回,有时不会返回。

这是takePicture返回时的输出:

10-02 19:24:36.570: INFO/ShotSingle(3198): ShotSingle::takePicture start
10-02 19:24:36.570: DEBUG/CameraHal(3198): 2489: takePicture() ENTER
10-02 19:24:36.570: DEBUG/MessageQueue(3198): MQ.put(5,0xb6590,0x0,0x8,0x80b0af55)
10-02 19:24:36.570: DEBUG/MessageQueue(3198): MessageQueue::put EXIT
10-02 19:24:36.578: DEBUG/MessageQueue(3198): MQ.get(5,0xb6590,0x0,0x8,0x80b0af55)
10-02 19:24:36.578: DEBUG/CameraHal(3198): 1458: CameraStop() ENTER
10-02 19:24:36.617: DEBUG/CameraHal(3198): 1543: CameraStop() EXIT
10-02 19:24:36.617: DEBUG/MessageQueue(3198): MQ.put(14,0xb6590,0x0,0x8,0x80b0af55)
10-02 19:24:36.617: DEBUG/MessageQueue(3198): MQ.get(14,0xb6590,0x0,0x8,0x80b0af55)
10-02 19:24:36.617: DEBUG/CameraHal(3198): 2497: takePicture() EXIT
10-02 19:24:36.617: INFO/ShotSingle(3198): ShotSingle::takePicture end

这是takePicture不返回时的输出:

10-02 19:25:20.671: INFO/ShotSingle(3198): ShotSingle::takePicture start
10-02 19:25:20.671: DEBUG/CameraHal(3198): 2489: takePicture() ENTER
10-02 19:25:20.671: DEBUG/MessageQueue(3198): MQ.put(5,0xb8cb8,0x0,0x8,0x80b0af55)
10-02 19:25:20.671: DEBUG/MessageQueue(3198): MessageQueue::put EXIT
10-02 19:25:21.343: INFO/StatusBarPolicy(3393): onSignalStrengthsChanged
10-02 19:25:22.609: WARN/PowerManagerService(3330): Timer 0x7->0x3|0x7
10-02 19:25:23.062: INFO/AudioStreamOutALSA(3198): (virtual android::status_t android::AudioStreamOutALSA::standby())  enter
10-02 19:25:23.125: ERROR/AudioStreamOutALSA(3198): Output standby called!!. Turn off PCM device.
10-02 19:25:23.125: INFO/ALSAStreamOps(3198): [ALSAStreamOps]codecOff mode = 0
10-02 19:25:23.234: INFO/AudioStreamOutALSA(3198): [AudioOutLock]Relase_wake_Lock 

有没有人对这个问题有任何解释或解决方案?

2 个答案:

答案 0 :(得分:6)

似乎问题是由于内存不足。我在调用takePicture()之前添加了System.gc()来解决它。

System.gc();
CameraParameters.mCamera.takePicture(null, null, jpegCallback);

答案 1 :(得分:2)

请参阅this。如果您正在使用预览回调,则可以在拍摄前删除它来解决问题。

mCamera.setPreviewCallback(null);
mCamera.takePicture(null, null, mPictureCallback);