2013-11-03 123 views
4

我想實現相機預覽。爲此,我有一個自定義View CameraView extends ViewGroup,它在構造函數中以編程方式創建一個surfaceView。按下電源按鈕時,SurfaceView for Camera Preview不會被破壞

我有以下的組分(higly簡化beverity):

ScannerFragment.java

public View onCreateView(..) { 
    //inflate view and get cameraView 
} 

public void onResume() { 
    //open camera -> set rotation -> startPreview (in a thread) -> 
    //set preview callback -> start decoding worker 
} 

public void onPause() { 
    // stop decoding worker -> stop Preview -> release camera 
} 

CameraView.java延伸的ViewGroup

public void setUpCalledInConstructor(Context context) { 
    //create a surfaceview and add it to this viewgroup -> 
    //get SurfaceHolder and set callback 
} 

/* SurfaceHolder.Callback */ 
public void surfaceCreated(SurfaceHolder holder) { 
    camera.setPreviewDisplay(holder); 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    //NOTHING is done here 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    camera.getParameters().setPreviewSize(previewSize.width, previewSize.height); 
} 

fragment_scanner.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <com.myapp.camera.CameraView 
     android:id="@+id/cameraPreview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 
</RelativeLayout> 

我想我已經設置了生命週期正確(獲取資源的onResume(),在onPause()粗暴地說釋放它)和下面的作品就好了:

  • 按HOME鍵和返回
  • 壓制和Taskswitcher並返回
  • 旋轉
  • 逼人退(當然)

但有一件事不工作,這是當我按下設備上的電源按鈕,然後返回相機預覽。結果是:預覽卡住了按鈕被按下之前最後捕獲的圖​​像。如果我旋轉它再次正常工作,因爲它會通過生命週期。

After some research我發現這可能是由於surfaceView在按下電源按鈕時不會被破壞,即SurfaceHolder.Callback.surfaceDestroyed(SurfaceHolder holder)不會被調用。實際上,當我比較home-button-case和power-button-case的(非常詳細的)日誌輸出時,除非'surfaceDestroyed'不會被調用,否則它是相同的。

到目前爲止,我找不到任何解決方法來解決它。我故意避免使用我的surfaceDestroyed()中的任何資源清理代碼,但這沒有幫助。我的想法是manually destroy the surfaceView like asked in this question,但這似乎不可能。我還用surfaceViews /相機測試了其他應用程序,他們似乎沒有這個問題。所以我會很感激任何提示或提示。

回答

1

只是嘗試添加

public void onDestroy() { 
// stop decoding worker -> stop Preview -> release camera 
} 

作爲做的onPause()因爲它可能只要暫停方法調用。

在我releaseCamera()這就是我做

private void releaseCamera() { 
    if (myCamera != null) { 
     FrameLayout preview = (FrameLayout) findViewById(R.id.cameraPreview); 
     preview.removeView(myPreview); 
     myCamera.setPreviewCallback(null); 
     myCamera.release(); 
     myCamera = null; 

    } 
} 

我取下CameraPreview(myPreview),這就是保持當前的圖片。並完全摧毀相機。

+0

問題不是我的停止/銷燬代碼沒有被調用,但我沒有選擇手動銷燬曲面視圖,因爲它應該銷燬自己 – for3st

0

mPreview.getHolder()。removeCallback(mPreview);應該有幫助?

相關問題