我已经写了code是用来显示相机。以下是我的布局文件中的code,
I have written a code that used to display camera. Following is my layout file's code,
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="schemas.android/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我的code,
And this is my code of 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; } }
以上code正常工作,但它显示的相机preVIEW在两个景观和放拉伸格式;人像模式如下图所示。
Above code works fine but it shows camera preview in stretched format in both landscape & portrait mode as following image.
然而,resultan摄像机图像不是拉伸它在仅preVIEW被拉伸正常模式。
However the resultan camera image is not stretched it is in normal mode only preview is stretched.
P.S。我问这个问题,试图这个
P.S. I am asking this question after trying this
推荐答案尝试添加
getWindow().setFormat(PixelFormat.UNKNOWN);在您的onCreate
in your onCreate
如果没有帮助,也许设置旋转将?
if that doesn't help maybe setting the rotation will?
camera.setDisplayOrientation(90);
如果仍然没有帮助,对谷歌所有的结果都这么说了SurfaceView的长宽比必须将照相机的纵横比相匹配
and if that still doesn't help, all the results on Google are saying the aspect ratio of the SurfaceView must match the aspect ratio of the camera
更多推荐
相机preVIEW是越来越捉襟见肘
发布评论