2014-11-15 43 views
5

我們是一羣爲Android開發實時視頻處理應用程序的開發人員。最近,一位客戶報告我們的應用程序凍結,只發生在Nexus 10設備上。我們買了自己和測試的設備:Nexus 10 camera.release掛起30秒

  • 設備來到了Android 4.2預裝 - 有在我們的應用程序
  • 沒有掛起,也沒有結冰升級的Android 4.3之後,我們的應用程序凍結在關閉相機(見下面的解釋)
  • 通過升級到4.4,我們的應用程序保持由閃爍了最新的Android 5.0的Nexus 10工廠畫面凍結
  • ,我們的應用程序仍然保持凍結
  • (編輯) - 該問題已經解決了通過升級的Nexus 10至Android 5.1
  • 關於凍結

的更多信息:

我們的應用程序打開的活動的onResume方法的相機,安裝預覽回調,設置預覽大小來最好的爲我們的加工需求(Nexus 10上,這是1920×1080)並開始預覽(如果從睡眠中恢復)或將其委託給SurfaceView回調的surfaceCreated方法。在onPause方法中,我們的應用程序刪除預覽回調,停止相機預覽並釋放相機。但是,我們的調查顯示,camera.release方法有時需要30秒才能完成。在那30秒內,我們的應用程序被凍結,因爲我們用來從UI線程控制攝像頭。後來我們將相機控件移動到單獨的事件處理程序線程,現在camera.release掛起該線程。雖然現在對用戶來說這是不可見的(用戶界面不被阻擋),但是直到我們的後臺線程成功釋放相機(即調用camera.release之後30秒),用戶才能從任何應用程序使用相機。

在杭期間,我們發現以下的日誌輸出從相機服務:

10-21 16:08:54.193: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight 
10-21 16:08:54.193: E/Camera2Client(122): stopPreviewL: Camera 0: Waiting to stop streaming failed: Connection timed out (-110) 
10-21 16:09:04.293: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight 
10-21 16:09:04.293: E/Camera2Client(122): stopPreviewL: Camera 0: Waiting to stop streaming failed: Connection timed out (-110) 
10-21 16:09:14.453: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight 
10-21 16:09:14.453: E/Camera2-StreamingProcessor(122): deletePreviewStream: Error waiting for preview to drain: Connection timed out (-110) 
10-21 16:09:24.573: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight 
10-21 16:09:24.573: E/Camera2-CallbackProcessor(122): deleteStream: Error waiting for HAL to drain: Connection timed out (-110) 
10-21 16:09:24.578: E/libexynosv4l2(122): failed to ioctl: VIDIOC_REQBUFS (-1 - Invalid argument) 
10-21 16:09:24.578: E/ExynosCameraHAL2(122): cam_int_reqbufs: VIDIOC_REQBUFS (fd:35) failed (-1) 
10-21 16:09:24.843: E/Camera2-CallbackProcessor(122): deleteStream: Camera 0: Device does not exist 
10-21 16:09:24.853: E/Camera2-StreamingProcessor(122): deletePreviewStream: Camera 0: Device does not exist 

你可以看到,觸發此行爲here最小的例子 - 相機的活動,需要重新啓動迅速幾次,以增加機會進入這個狀態。我們注意到它在我們的應用中比在示例應用中更經常發生。我們的應用程序執行一些沉重的幀處理,也使用GPU進行圖像處理,此外相機還使用加速計和方向傳感器 - 所有這些都不包含在示例應用程序中。

我們還看到了一些關於同一問題的未解答的StackOverflow問題(question 1question 2)。您能否解釋一下代碼路徑會導致上述日誌輸出以及如何避免進入該狀態?

到目前爲止,我們沒有遇到任何其他設備上提到的相機凍結問題。

回答

2

不幸的是,您遇到了Nexus 10相機HAL中的非確定性錯誤。

儘管我們試圖反覆追蹤這個問題,但我們顯然沒有在這裏找到所有問題的實例。

在解決方法方面,您可以嘗試簡單地關閉相機設備,而不必刪除回調並停止預覽;它不應該分階段進行關閉。

+0

我試着簡單地釋放相機設備,但沒有刪除回調和停止預覽,但仍需要30秒才能釋放相機。我們現在將嘗試使用Camera2 API來實現我們的相機管理代碼,希望這不會導致掛起... – DoDo

+0

我們已經在L版本中解決了有關N10的一些問題,所以希望您會看到這樣做會更好在L或其中一個後續更新中。 –

+0

昨天我們的N10收到了Android 5.0.2的更新,但問題仍然沒有解決。任何想法在哪個版本應該修復到達? – DoDo