2013-11-03 71 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);应该有帮助?

相关问题