【问题标题】:Camera preview is completely black after screen off, screen on屏幕关闭后,相机预览完全黑屏,屏幕打开
【发布时间】:2012-11-14 19:23:53
【问题描述】:

我正在使用 Android SDK 附带的 API 演示中的 CameraPreview。在相机预览运行时,如果我关闭屏幕并再次打开,相机预览会完全变黑。设备的相机应用程序设法恢复了相机预览,所以一定有办法。

并非我尝试过的所有设备都表现出这种行为。我无法确认,但操作系统版本似乎很重要。

【问题讨论】:

  • 和我一样的 pblm,你找到解决办法了吗?

标签: android camera surfaceview


【解决方案1】:

您需要在暂停/恢复中释放并重新获取相机。以下是我的 CameraView 小部件中的一些代码:

public void onPause(){
    if(camera != null){
        camera.release();
        camera = null;
    }
}

public void onResume(){
    //Need to release if we already have one, or we won't get the camera
    if(camera != null){
        camera.release();
        camera = null;          
    }
    try {
        camera = Camera.open(); 
    }
    catch (Exception e){
    }

}

【讨论】:

  • 我正在使用 API 演示。他们已经在 onPause 和 onResume 中获取/释放相机。
  • 那就不知道了。但我确实知道我在编写我的应用程序时遇到了这个问题,这是修复它的确切代码。
【解决方案2】:

帮助我的是 onResume() 中的 setContentView()。

可以是

protected void onResume() {
    super.onResume();
    setContentView(R.layout.xxx);
    // ...
}

或

private View cachedContentView;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    cachedContentView = doCreateContentView(getLayoutInflater());
    // ...
}
protected void onResume() {
    super.onResume();
    setContentView(cachedContentView);
    // ...
}

它们都有效。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。也许,这不是最好的解决方案,但它对我有用。 在 onPause() 方法中重新启动您的相机活动。

    private boolean isBackPreesed = false;
    
    @Override
    public void onPause() {
        if (camera != null) {
            camera.release();
            camera = null;
        }
    
        if (!isBackPreesed) {
            finish();
            Intent restart = new Intent(this, this.getClass());
            startActivity(restart);
        }
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            isBackPreesed = true;
        }       
        return super.onKeyDown(keyCode, event);
    }
    

    【讨论】:

      【解决方案4】:

      我的解决方案是在 surfaceDestroyed 方法中释放相机,而不是在 onPause 方法中,然后在 surfaceCreated 方法中重新启动相机。结果很好。

      【讨论】:

      • 那么,你认为它在多大程度上是回答而不是评论?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多