我正在编写一个Android 拍照应用程序。该代码在 onPreviewFrame(byte[] data, Cameracamera) 中从预览中获取帧后进行一些处理。
问题在于 android.hardware.Camera 的函数 takePicture() 有时会完全按照我的要求执行,有时不会返回并且不会调用任何回调。当我运行应用程序时,有时拍摄第一张照片不会返回,有时我可以拍摄四张照片,第五张照片将导致应用程序挂起。有一个类似的线程:使用android相机拍照的问题 https://stackoverflow.com/questions/7258473/problem-with-taking-pictures-using-the-android-camera。建议的解决方案是使用上次预览中的框架,但这肯定不是一个好的解决方案!这个问题可能会出现,因为 takePicture 是 Asancronous (安卓文档 http://developer.android.com/reference/android/hardware/Camera.html#takePicture%28android.hardware.Camera.ShutterCallback,%20android.hardware.Camera.PictureCallback,%20android.hardware.Camera.PictureCallback,%20android.hardware.Camera.PictureCallback%29).
我只是像这样调用 takePicture() 函数:
public static void takePicture() {
mCamera.takePicture(null, null, jpegCallback);
}
Here http://www.mediafire.com/?e4b3wucgg2rf1xp是 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
有人对这个问题有任何解释或解决方案吗?