2011-11-24 68 views
5

我有一個帶有2個選項卡(活動)的選項卡活動。每個選項卡都有一個3D Open GL場景,在具有相機預覽功能的SurfaceView頂部繪製。帶相機預覽的SurfaceView不會被破壞

但是,根據設備方向,標籤正在切換。

問題是,當其他活動開始時,它會調用camera.open(),它會生成異常,並說相機服務不可用。

事實上,問題在於當活動暫停時攝像機不停止,換句話說onSurfaceDestroyed()沒有爲SurfaceView調用。 當onPause()調用活動時,我試圖停止攝像機,但仍得到相同的錯誤。

任何人都有與選項卡活動相同的問題?任何想法如何使surfaceview被破壞?

+0

你叫兩個'.stopPreview()'和'.release()'你的相機對象? –

+0

是的,看下面的代碼。 –

回答

5

看起來這個問題很流行,所以我在這裏再增加一次解決方案。

根本原因是SurfaceDestroyed在應用暫停時從未被調用過SurfaceView。

所以我創建了一個包含所有子視圖的framelayout。 將其設置爲內容視圖。 通過簡單地調用onPause()中的setVisibility(View.GONE)和onResume()中的View.Visible來停止攝像機。這將導致SurfaceView的破壞。

3
private SurfaceHolder.Callback mSurfaceHolderListener = new SurfaceHolder.Callback() { 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     Log.e("TABACT", "surfaceDestroyed()"); 
     camera.stopPreview(); 
     camera.setPreviewCallback(null); 
     camera.release(); 
     camera = null; 
    } 
+1

找到解決方案。首先爲每個選項卡式活動創建一個包含所有子視圖的框架佈局。將其設置爲內容視圖。然後通過在onResume()中調用onPause()setVisibility來View.GONE和View.Visible來停止攝像機。 –

+0

非常感謝。我遇到了問題,在索尼愛立信Xperia mini上,下拉通知欄中的USB啓用/禁用菜單暫停了我的相機應用程序,但沒有破壞表面。令人驚訝的是,只有啓用/禁用菜單出現此問題,USB調試設置菜單正常運行。直接使用setVisibility()爲SurfaceView進行相機預覽可以完全解決問題。 – Nantoka

0

這是確定對我來說:

public void surfaceDestroyed(SurfaceHolder holder) { 
     Log.e("TABACT", "surfaceDestroyed()"); 
     camera.stopPreview(); 
     camera.setPreviewCallback(null); 
     camera.release(); 
     camera = null; 
    }