我写了一个用来显示相机的代码。以下是我的布局文件代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<FrameLayout
android:id="@+id/previewLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</FrameLayout>
<LinearLayout
android:id="@+id/startBar"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:background="@drawable/leftbarbg"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:id="@+id/MuteBtn"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="2"
android:src="@drawable/mutebtn" />
<ImageView
android:id="@+id/VideosBtn"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="2"
android:src="@drawable/videosbtn" />
<ImageView
android:id="@+id/RecBtn"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="3"
android:src="@drawable/action_rec_selected" />
<ImageView
android:id="@+id/SettingsBtn"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="2"
android:src="@drawable/settingsbtn" />
<ImageView
android:id="@+id/ChatBtn"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="2"
android:src="@drawable/chatbtn" >
</ImageView>
</LinearLayout>
<RelativeLayout
android:id="@+id/stopBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="3dp"
android:visibility="gone" >
<ImageView
android:id="@+id/StopBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/stopbtn" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="20dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="70dp"
android:layout_marginTop="20dp" >
<ImageView
android:id="@+id/MenuBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:src="@drawable/menubtn" />
<ImageView
android:id="@+id/LiveModeBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:src="@drawable/livemodeoff" />
<Chronometer
android:id="@+id/video_chronometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:textSize="28sp"
android:textStyle="bold" />
</RelativeLayout>
</RelativeLayout>
这是我的CameraSurfaceview代码,
public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder holder;
private Camera camera;
private MediaRecorder mediaRecorder;
private Boolean previewing;
private AutoFocusManager autoFocusManager;
private CameraDetectionObserver cameraDetectionObserver;
public CameraSurfaceView(Context context, AutoFocusManager autoFocusManager, CameraDetectionObserver cameraDetectionObserver) {
super(context);
this.holder = this.getHolder();
this.holder.addCallback(this);
this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
this.autoFocusManager= autoFocusManager;
this.cameraDetectionObserver= cameraDetectionObserver;
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
if (camera != null) {
Camera.Parameters parameters = camera.getParameters();
List< String > FlashModes = parameters.getSupportedFlashModes();
if (FlashModes.contains(Parameters.FLASH_MODE_AUTO)) {
parameters.setFlashMode(Parameters.FLASH_MODE_AUTO);
System.out.println("FLASH_MODE_AUTO");
}
List< String > WhiteBalance = parameters.getSupportedWhiteBalance();
if (WhiteBalance.contains(Parameters.WHITE_BALANCE_AUTO)) {
parameters.setFlashMode(Parameters.WHITE_BALANCE_AUTO);
System.out.println("WHITE_BALANCE_AUTO");
}
List< String > Antibanding = parameters.getSupportedAntibanding();
if (Antibanding.contains(Parameters.ANTIBANDING_AUTO)) {
parameters.setAntibanding(Camera.Parameters.ANTIBANDING_AUTO);
System.out.println("ANTIBANDING_AUTO");
}
List<Size> previews = parameters.getSupportedPreviewSizes();
int i = 0;
parameters.setPreviewSize( previews.get(4).width, previews.get(4).height );
camera.setParameters(parameters);
camera.startPreview();
autoFocusManager.startAutoFocus(camera);
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (camera != null) {
camera.release();
camera = null;
}
try {
camera = Camera.open(findBackFacingCamera());
camera.setPreviewDisplay(holder);
previewing = true;
cameraDetectionObserver.cameraInitializationStatus(true);
} catch (IOException e) {
camera.release();
camera = null;
}catch (Exception e) {
e.printStackTrace();
cameraDetectionObserver.cameraInitializationStatus(false);
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (previewing) {
camera.stopPreview();
camera.release();
camera = null;
previewing = false;
autoFocusManager.stopAutoFocus();
System.out.println("surface destroyed");
}
}
public void stopPreview(){
if (previewing) {
camera.stopPreview();
camera.release();
camera = null;
previewing = false;
autoFocusManager.stopAutoFocus();
System.out.println("surface destroyed");
}
}
public Camera getCamera()
{
return this.camera;
}
public MediaRecorder getMediaRecorder(){
mediaRecorder = new MediaRecorder();
camera.unlock();
mediaRecorder.setCamera(camera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mediaRecorder.setPreviewDisplay(holder.getSurface());
mediaRecorder.setVideoFrameRate(29);
mediaRecorder.setVideoSize(ByteArraysForLogin.VideoDimention.vWidth,ByteArraysForLogin.VideoDimention.vHeight);
return mediaRecorder;
}
private int findBackFacingCamera() {
int cameraId = -1;
// Search for the back facing camera
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;
}
}
以上代码工作正常,但它在横向和展示中以拉伸格式显示相机预览肖像模式如下图所示。
然而,结果相机图像没有拉伸,它处于正常模式,只有拉伸预览。
P.S。我在尝试this
后问这个问题答案 0 :(得分:1)
尝试添加
getWindow().setFormat(PixelFormat.UNKNOWN);
你的onCreate 中的
如果没有帮助,可能会设置旋转吗?
camera.setDisplayOrientation(90);
如果仍然没有帮助,Google上的所有结果都表明SurfaceView的宽高比必须与相机的宽高比相匹配
答案 1 :(得分:0)
尝试使用不同的分辨率并增加帧宽和高度