我想實現相機預覽。爲此,我有一個自定義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 /相機測試了其他應用程序,他們似乎沒有這個問題。所以我會很感激任何提示或提示。
問題不是我的停止/銷燬代碼沒有被調用,但我沒有選擇手動銷燬曲面視圖,因爲它應該銷燬自己 – for3st