2015-07-21 110 views
2

在我正在开发的应用程序中,我使用了教程来使用相机,但当应用程序打开后,1或2秒后,预览会冻结。事情是:如果我按回家,然后回去的应用程序,它正常工作。Android Camera Preview在应用程序打开后立即冻结

这里我的代码:

private SurfaceView preview=null; 
private SurfaceHolder previewHolder=null; 
private Camera camera=null; 
private boolean inPreview=false; 
private boolean cameraConfigured=false 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ... 
    preview=(SurfaceView)findViewById(R.id.preview); 
    previewHolder = preview.getHolder(); 
    previewHolder.addCallback(surfaceCallback); 
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

private void startPreview() { 
    if (cameraConfigured && camera!=null) { 

     camera.setDisplayOrientation(90); 
     camera.startPreview(); 
     inPreview=true; 
    } 
} 

private Camera.Size getBestPreviewSize(int width, int height, 
             Camera.Parameters parameters) { 
    Camera.Size result=null; 

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) { 
     if (size.width<=width && size.height<=height) { 
      if (result == null) { 
       result = size; 
      } else { 
       int resultArea = result.width * result.height; 
       int newArea = size.width * size.height; 

       if (newArea > resultArea) { 
        result = size; 
       } 
      } 
     } 
    } 
    camera.setDisplayOrientation(90); 
    return(result); 
} 

private void initPreview(int width, int height) { 
    if (camera!=null && previewHolder.getSurface()!=null) { 
     try { 
      camera.setPreviewDisplay(previewHolder); 
     } 
     catch (Throwable t) { 
      Log.e("Preview-surfaceCallback", 
        "Exception in setPreviewDisplay()", t); 
      Toast 
        .makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_LONG) 
        .show(); 
     } 

     if (!cameraConfigured) { 
      Camera.Parameters parameters=camera.getParameters(); 
      Camera.Size size=getBestPreviewSize(width, height, 
        parameters); 

      if (size!=null) { 
       parameters.setPreviewSize(size.width, size.height); 
       camera.setParameters(parameters); 
       cameraConfigured=true; 
      } 
     } 
    } 
} 

SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() { 
    public void surfaceCreated(SurfaceHolder holder) { 
     // no-op -- wait until surfaceChanged() 

    } 

    public void surfaceChanged(SurfaceHolder holder, 
           int format, int width, 
           int height) { 
     initPreview(width, height); 
     startPreview(); 

    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // no-op 
    } 
}; 


protected void onPause() { 
    if (inPreview) { 
     camera.stopPreview(); 
    } 

    camera.release(); 
    camera=null; 
    inPreview=false; 
    super.onPause(); 
} 

protected void onResume() { 
    super.onResume(); 
    camera = Camera.open(); 
    startPreview(); 
} 

回答

1

如果该行为是你解释想想...有一个lifecycle,使您的应用程序的工作。

所以,请检查你有你的和onResume方法,让你的相机预览的工作不错...

如果我打赌,我会说:

camera = Camera.open(); 

必须在onCreate()

UPDATE试试这个:

SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() { 
    public void surfaceCreated(SurfaceHolder holder) { 
     mCamera = Camera.open(); 
     mCamera.setPreviewDisplay(holder);  
    } 

    public void surfaceChanged(SurfaceHolder holder, 
           int format, int width, 
           int height) { 
     initPreview(width, height); 
     startPreview(); 

    } 
} 

检查this link更多信息

+0

我试过了,但应用程序崩溃,并说,它无法opent他的相机。 – Myrium

+0

或者你的意思是从onResume中取出并放入onCreate函数中? – Myrium

+0

你必须离开'onResume'并修改'Camera'初始化以使非崩溃呼叫预览....检查我的更新... –

相关问题