2011-06-29 42 views
7

我有一個顯示相機預覽的應用程序,我希望用戶能夠將手機置於睡眠狀態,然後將其喚醒,以便我的應用程序能夠正確恢復。問題是,從睡眠中返回時,相機預覽不會重新啓動。如何從睡眠中恢復相機預覽?

我已經實現了api演示中呈現的相機預覽,但似乎api演示示例僅通過純粹的運氣才起作用。在該示例中,屏幕方向被強制爲橫向,這意味着每次手機進入休眠狀態時,手機都會進行配置更改,因爲鎖定屏幕處於縱向模式。如果在相機預覽應用程序(如我的)中使用肖像模式,則會出現bug表面。

我收集到的錯誤與表面視圖的重新創建有關。表面在onPause時應該被銷燬,然後在onResume之後重新創建,但是在睡覺時不會發生。看起來我必須銷燬整個活動,然後重新創建它以使相機預覽再次運行。我希望能夠重新創建表面視圖。

除了重新創建整個活動外,是否有強制重新繪製表面視圖的方法?

回答

5

一個解決方案可能會將surfaceview設置爲onResume()中不可見和可見,這會使surfaceview消失並重新創建。我有同樣的問題,在這裏

+0

+1謝謝,確實有幫助!但是:在相機實現中,我還必須傳遞所拍攝和保存的圖像的文件Uri,而不是將原始字節數組傳回給調用相機的活動,因爲嘗試傳遞字節數組導致Failed Binder睡眠後的交易。 – AgentKnopf

+0

Jason的解決方案適用於我的4.0及更高版本的設備,但是我的3.0及更低版本的設備仍然表現出相同的症狀。有小費嗎? – rotinegg

3

的原因:

該方法的onPause不回收CameraPreview類我做(實現SurfaceView回調)。代替試圖重新實例化整個對象本身,我僅更新攝像機對象引用我經過它是要麼

null 

cameraPreview.setCamera(mCamera); 

我稱爲getCameraInstance方法重新初始化相機,然後將它傳遞給preivew對象。

現在的問題是在這裏:

private void initializeCameraView(){ 

    RelativeLayout preview = (RelativeLayout)rootView.findViewById(R.id.camera_preview); 

    preview.addView(cameraPreview); 
} 

中的onResume,我稱這種方法重新初始化cameraPreview對象。 然而,它凍結,因爲我試圖添加另一個cameraPreview到預覽視圖。這是我的解決方法,簡單明瞭。如果它已經存在,刪除它,然後把它放回去。希望這有助於!

private void initializeCameraView(){ 

    RelativeLayout preview = (RelativeLayout)rootView.findViewById(R.id.camera_preview); 
    //removes the problem with the camera freezing onResume 
    if(cameraPreview != null) { 
     preview.removeView(cameraPreview); 
    } 
    preview.addView(cameraPreview); 
} 
+0

男人這是一個困擾我3天而不能入睡的問題的答案:D謝謝! –

+0

爲什麼沒有人投票給這個答案?它幫助我出去! – DYS