相机预览显示空白屏幕

时间:2015-10-04 15:09:38

标签: android-camera surfaceview preview

public class cameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
private Activity act;
private int currentCameraId;
private boolean cameraFront;
private boolean InPreview;
//private SurfaceView SV;

public cameraPreview(Context context, Activity A, SurfaceView SFV) {
    super(context);
    mCamera = null;
    mHolder = null;
    InPreview = false;

    act = A;

    mHolder = SFV.getHolder();
    mHolder.addCallback(this);
    initialzeCamera();
}

private void initialzeCamera() 
{
    initializeCameraBool();
    OpenCamera();

}

public void OpenCamera() 
{
    if(mCamera==null)
    {
        Log.e("open", "sesami");
        if(cameraFront)
            mCamera.open(cameraPreview.findFrontFacingCamera());
        else
            mCamera.open(cameraPreview.findBackFacingCamera());
    }
    //StartPreview();
}

private void StartPreview() 
{
    if (mHolder.getSurface() == null || mCamera == null){
        Log.e("Stop", "in the name of the law");
        return;
      }

    Log.e("Started", "from the bottom");

    if(InPreview)
    {
        mCamera.stopPreview();
        InPreview = false;
    }
    setCameraDisplayOrientation();


    if(!InPreview)
    {
        try {
            mCamera.setPreviewDisplay(mHolder);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        mCamera.startPreview();
        InPreview = true;
    }
}

public void releaseCamera() 
{
    if (mCamera != null) {
        if(InPreview)
            mCamera.stopPreview();

        mCamera.release();
        mCamera = null;
    }
}

public void surfaceCreated(SurfaceHolder holder) {
    StartPreview();
}

public void surfaceDestroyed(SurfaceHolder holder) {
    releaseCamera();
}

public void setCameraDisplayOrientation() {
    android.hardware.Camera.CameraInfo info =
            new android.hardware.Camera.CameraInfo();
    android.hardware.Camera.getCameraInfo(currentCameraId, info);
    int rotation = act.getWindowManager().getDefaultDisplay()
            .getRotation();
    int degrees = 0;
    switch (rotation) {
        case Surface.ROTATION_0: degrees = 0; break;
        case Surface.ROTATION_90: degrees = 90; break;
        case Surface.ROTATION_180: degrees = 180; break;
        case Surface.ROTATION_270: degrees = 270; break;
    }

    int result;
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
        result = (info.orientation + degrees) % 360;
        result = (360 - result) % 360;  // compensate the mirror
    } else {  // back-facing
        result = (info.orientation - degrees + 360) % 360;
    }
    if(mCamera!=null)
        mCamera.setDisplayOrientation(result);
}


public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{   
    StartPreview();
}

public static int findBackFacingCamera() {
    int cameraId = -1;
    int numberOfCameras = Camera.getNumberOfCameras();
    for (int i = 0; i < numberOfCameras; i++) {
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(i, info);
        if (info.facing == CameraInfo.CAMERA_FACING_BACK) {
            cameraId = i;
            break;
        }
    }
    return cameraId;
}

public static int findFrontFacingCamera() {
    int cameraId = -1;
    int numberOfCameras = Camera.getNumberOfCameras();
    for (int i = 0; i < numberOfCameras; i++) {
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(i, info);
        if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
            cameraId = i;
            break;
        }
    }
    return cameraId;
}

private void initializeCameraBool() 
{
    if(cameraPreview.findBackFacingCamera()>=0)
        cameraFront = false;
    else
        cameraFront = true;
}

}

因此,我传入的表面视图来自主要活动,并且它从布局中获取。布局只是一个表面视图。当我启动它虽然它只显示黑屏。我不明白为什么会这样。它应该是启动预览显示但由于某种原因它没有显示它。

0 个答案:

没有答案