问题
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