2013-02-28 10 views
7

Ho scritto un codice utilizzato per visualizzare la telecamera. In seguito è il codice del mio file di layout,L'anteprima della fotocamera si sta allungando

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

E questo è il mio codice di 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; 
    } 
} 

Sopra codice funziona bene ma mostra anteprima della fotocamera in formato allungato sia in modalità orizzontale & come immagine seguente .

enter image description here

Tuttavia l'immagine della telecamera resultan evitare tensioni è in modalità normale è allungato solo anteprima.

P.S. Sto chiedendo a questa domanda dopo aver provato this

+0

prova a rendere la tua attività a schermo intero – WSS

+1

Ciao, questa è una domanda di un anno, hai trovato una soluzione? Sto affrontando lo stesso problema. Alcuni dispositivi analizzeranno l'anteprima con LayoutParams, ma altri sembrano ignorare i margini fuori schermo (kindle fire, Motorola Atrix, Galaxy Tab 2) – Moxor

risposta

1

prova ad aggiungere

getWindow().setFormat(PixelFormat.UNKNOWN); 

nel vostro onCreate

se questo non aiuta forse impostando la rotazione sarà?

camera.setDisplayOrientation(90); 

e se questo ancora non aiuta, tutti i risultati su Google hanno da dire il rapporto di aspetto del SurfaceView deve corrispondere al rapporto di aspetto della fotocamera

0

cercare di utilizzare diversa risoluzione e aumentare la larghezza del telaio e altezza

Problemi correlati