2011-10-02 19 views
3

我正在爲Android寫一個應用程序來拍照。代碼在從onPreviewFrame(byte [] data,Camera camera)的預覽中獲取幀後執行一些處理。 問題是android.hardware.Camera的函數takePicture()有時會做我想要的東西,有時不會返回,也不會調用回調函數。當我運行應用程序一些時候,第一張照片不會返回,有時我可以拍攝四張照片,第五張會導致應用程序掛起。有一個simillar線程:problem with taking pictures using the android camera。建議的解決方案是使用上次預覽的框架,但它肯定不是一個好的解決方案!此問題可能會引起,因爲takePicture是Asancronous(Android Doc)。Android Camera.takePicture()不會返回一些?

我只需調用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 

有沒有人有這個問題的任何解釋或解決方案?

+1

這是根本原因:https://code.google.com/p/android/issues/detail?id=13966 – poiuytrez

回答

6

看來問題在於內存不足。我在調用takePicture()之前通過添加System.gc()來解決它。

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

'的System.gc();'不建議在代碼中使用。 –

2

請參閱this。如果您正在使用預覽回調,則可能在拍攝照片之前通過刪除它來解決問題。

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

我不認爲這可以解決問題。 –