2013-02-28 68 views
7

我寫了一個用於顯示攝像頭的代碼。以下是我的佈局文件的代碼,攝像頭預覽正在變得越來越深

<?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; 
    } 
} 

上面的代碼工作正常,但它顯示的相機預覽在拉伸格式在風景&肖像模式下圖像。

enter image description here

然而resultan攝像機圖像不被拉伸它是在正常模式下僅預覽被拉伸。

P.S.我問這個問題,試圖this

+0

嘗試使您的活動在全屏幕 – WSS 2013-02-28 06:12:15

+1

嗨,這是一個一年的問題,你有沒有找到一個解決方案?我面臨同樣的問題。有些設備將使用LayoutParams進行預覽,但其他設備似乎忽略了屏幕外邊緣(kindle fire,Motorola Atrix,Galaxy Tab 2) – Moxor 2015-01-05 15:21:28

回答

1

嘗試加入

getWindow().setFormat(PixelFormat.UNKNOWN); 

後您的onCreate

,如果沒有幫助,也許設置旋轉將?

camera.setDisplayOrientation(90); 

,如果仍然沒有幫助,所有對谷歌的結果都在說SurfaceView的縱橫比,必須相機的縱橫比

0

嘗試匹配,並且使用不同的分辨率並增加幀的寬度和高度