How to get normal Camera view in Surfaceview android?

橙三吉。 提交于 2019-12-11 23:12:45

问题


Right now, i am doing an sample app where i have to use camera in surfaceview. I have successfully set the camera in surfaceview but i can't get the normal camera view in it, width and height gets changed. Below is my code, i am pleased to get any ideas from anyone.

Camera class:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera);
            cameraObject = isCameraAvailiable();
    showCamera = new ShowCamera(this, cameraObject);
    preview.addView(showCamera);
            takePhotoButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
        cameraObject.takePicture(null, null, capturedIt);
        cameraObject.stopPreview();
        preview.removeView(showCamera);
        cameraObject.release();
        cameraObject = Camera.open();
        showCamera = new ShowCamera(Photo.this, cameraObject);

        preview.addView(showCamera);
        }
    });
}

SurfaceHolder class:

public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback {

private SurfaceHolder holdMe;
private Camera theCamera;

public ShowCamera(Context context, Camera camera) {
    super(context);
    theCamera = camera;
    holdMe = getHolder();
    holdMe.addCallback(this);
}

public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    theCamera.stopPreview();
    theCamera.setDisplayOrientation(90);
    camWidth = width;
    camHeight = height;
    theCamera.startPreview();
    initPreview(width, height);
}

private void initPreview(int width, int height) {
    // Log.i(TAG, "initPreview()starts");

    if (theCamera != null) {
        try {
             Camera.Parameters param;
             param = camera.getParameters();
             param.setPreviewSize(176, 144);
             camera.setParameters(param);
            theCamera.setPreviewDisplay(holdMe);
        } catch (Throwable t) {
            Log.e("PreviewDemo-surfaceCallback",
                    "Exception in setPreviewDisplay()", t);
        }
    }

    // Log.i(TAG, "initPreview() ends");
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    try {
        theCamera.setDisplayOrientation(90);
        theCamera.setPreviewDisplay(holdme);
        theCamera.startPreview();
    } catch (IOException e) {
    }
}

public void surfaceDestroyed(SurfaceHolder arg0) {
    this.getHolder().removeCallback(this);
    theCamera.stopPreview();
    theCamera.release();
}

}

Framelayout.xml

<FrameLayout
    android:id="@+id/preview1"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:layout_alignParentLeft="true">

</FrameLayout>


回答1:


If you want your to display the camera without distortion, you should override layout_height for preview frame. If you know that the camera supports 176x144 preview size, and this is what you really want to use, then simply set the layout parameters of preview,

showCamera = new ShowCamera(this, cameraObject);

ViewGroup.LayoutParams lp = preview.getLayoutParams();
lp.width = getWindowManager().getDefaultDisplay().getWidth();
//*** no, this is wrong!! ***   lp.height = lp.width*144/176;
lp.height = lp.width*176/144; // that's correct for Camera.setDisplayOrientation(90) !!
preview.setLayoutParams(lp);

preview.addView(showCamera);


来源:https://stackoverflow.com/questions/26135405/how-to-get-normal-camera-view-in-surfaceview-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!