2015-07-10 66 views
0

我正在製作自定義相機應用程序。我想實現自定義預覽。 預覽僅在第一次打開後纔會始終顯示黑屏。 如果有人知道爲什麼請幫助我!如何在android中創建相機自定義預覽

我的相機類:

public class CamTestActivity extends Activity { 

    private static final String TAG = "CamTestActivity"; 

    Preview preview; 
    Camera camera; 
    int cameraId; 
    SurfaceView sv; 

    private int rotation; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.main); 
     cameraId = Camera.CameraInfo.CAMERA_FACING_BACK; 
     sv = (SurfaceView) findViewById(R.id.surfaceView); 
     preview = new Preview(this, sv); 

     preview.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 
       LayoutParams.MATCH_PARENT)); 
     ((RelativeLayout) findViewById(R.id.layout)).addView(preview); 
     preview.setKeepScreenOn(true); 
     // holder = sv.getHolder(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     openCamera(cameraId); 
    } 

    public boolean openCamera(int id) { 
     boolean result = false; 
     cameraId = id; 

     releaseCamera(); 
     try { 
      camera = Camera.open(cameraId); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
     if (camera != null) { 
      try { 
       setUpCamera(camera); 
       camera.setErrorCallback(new ErrorCallback() { 

        @Override 
        public void onError(int error, Camera camera) { 

        } 
       }); 
       camera.setPreviewDisplay(preview.mHolder); 
       camera.startPreview(); 
       result = true; 
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
       result = false; 
       releaseCamera(); 
      } 
     } 
     return result; 
    } 

    private void setUpCamera(Camera c) { 
     Camera.CameraInfo info = new Camera.CameraInfo(); 
     Camera.getCameraInfo(cameraId, info); 
     rotation = getWindowManager().getDefaultDisplay().getRotation(); 
     int degree = 0; 
     switch (rotation) { 
      case Surface.ROTATION_0: 
       degree = 0; 
       break; 
      case Surface.ROTATION_90: 
       degree = 90; 
       break; 
      case Surface.ROTATION_180: 
       degree = 180; 
       break; 
      case Surface.ROTATION_270: 
       degree = 270; 
       break; 

      default: 
       break; 
     } 

     if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
      // frontFacing 
      rotation = (info.orientation + degree) % 330; 
      rotation = (360 - rotation) % 360; 
     } 
     else { 
      // Back-facing 
      rotation = (info.orientation - degree + 360) % 360; 
     } 
     c.setDisplayOrientation(rotation); 
     Parameters params = c.getParameters(); 

     // showFlashButton(params); 

     List<String> focusModes = params.getSupportedFlashModes(); 
     if (focusModes != null) { 
      if (focusModes 
        .contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { 
       params.setFlashMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 
      } 
     } 

     params.setRotation(rotation); 
    } 

    private void releaseCamera() { 
     try { 
      if (camera != null) { 
       camera.setPreviewCallback(null); 
       camera.setErrorCallback(null); 
       camera.stopPreview(); 
       camera.release(); 
       camera = null; 
      } 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
      Log.e("error", e.toString()); 
      camera = null; 
     } 
    } 
} 
+0

請點擊此http://developer.android.com/guide/topics/media/camera.html – deniz

+0

'Camera.open()'可能需要一段時間。 Google建議不要在UI線程上進行此調用。 –

+0

請花一些時間閱讀[幫助頁面](http://stackoverflow.com/help),特別是名爲「我可以問什麼問題?」的部分?和「我應該避免問什麼類型的問題?」。更重要的是,請閱讀[Stack Overflow問題清單](http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist)。您可能還想了解[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – galath

回答

-2

好像你忘記釋放你的相機。

添加releaseCamera

@Override 
protected void onPause() { 
    releaseCamera(); 
    super.onPause(); 
}