2013-12-16 8 views
6

Re-Avvio personalizzato Camera, mentre si fa il cambiamento in Modalità di anteprima, da orizzontale a verticale, o Verticale a Orizzontale, il mio codice di classe di superficie si presenta così:Disabilita Orientamento Change

PreviewSurface .java: -

public class PreviewSurface extends SurfaceView implements 
SurfaceHolder.Callback { 

    public static final String LOG_TAG = "CameraPreview"; 
    private SurfaceHolder mSurfaceHolder; 

    private Camera mCamera; 

    // Constructor that obtains context and camera 
    @SuppressWarnings("deprecation") 
    public PreviewSurface(Context context, Camera camera) { 
     super(context); 
     this.mCamera = camera; 

     this.mSurfaceHolder = this.getHolder(); 
     this.mSurfaceHolder.addCallback(this); 
     this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     this.mSurfaceHolder.setFixedSize(100, 100); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder surfaceHolder) { 
     try {  
      Camera.Parameters parameters = mCamera.getParameters(); 
      if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) 
      { 
       parameters.set("orientation", "portrait"); 
       mCamera.setDisplayOrientation(90); 
       parameters.setRotation(90); 
       mCamera.setPreviewDisplay(surfaceHolder); 
       mCamera.startPreview(); 
      } 
      else 
      { 
       // This is an undocumented although widely known feature 
       parameters.set("orientation", "landscape"); 
       // For Android 2.2 and above 
       mCamera.setDisplayOrientation(0); 
       // Uncomment for Android 2.0 and above 
       parameters.setRotation(0); 
      } 
      mCamera.setPreviewDisplay(surfaceHolder); 
      mCamera.startPreview(); 

     } catch (IOException e) { 
      // left blank for now 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
     mCamera.stopPreview(); 
     mCamera.release(); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, 
      int width, int height) { 

     try {  
      Camera.Parameters parameters = mCamera.getParameters(); 
      if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) { 
       parameters.set("orientation", "portrait"); 
       mCamera.setDisplayOrientation(90); 
       parameters.setRotation(90); 

      } 
       else { 
         // This is an undocumented although widely known feature 
         parameters.set("orientation", "landscape"); 
         // For Android 2.2 and above 
         mCamera.setDisplayOrientation(0); 
         // Uncomment for Android 2.0 and above 
         parameters.setRotation(0); 
      } 
      mCamera.setPreviewDisplay(surfaceHolder); 
      mCamera.startPreview(); 

     } catch (IOException e) { 
      // left blank for now 
     }   
    } 

} 

si può sapere dove sto facendo male, quello che ho perso nel mio codice?

+0

È necessario gestire l'altezza e la larghezza dell'anteprima anche sulla modifica della configurazione. – TheLittleNaruto

risposta

12

È necessario gestire la modifica della configurazione per l'app.

Aggiungi questa linea al tuo AndroidManifest.xml.

android:configChanges="keyboardHidden|orientation|screenSize" 

Questo dice al sistema di ciò che modifiche di configurazione che si sta per gestire se stessi - in questo caso per non fare nulla.

Speranza che aiuta ツ

+1

Grazie sta funzionando ... – PankajAndroid

+0

ottimo .. felice che ti aiuti :) –

0

Non è chiaro dalla tua domanda che cosa ti lamenti, ma ti sembra di manipolare solo i parametri della telecamera, non chiamando mCamera.setParameters(parameters). Questo da solo può causare confusione.

Utilizzando parameters.set("orientation", "landscape"); sui dispositivi che non supportano questo parametro può causare RuntimeException in mCamera.setParameters(parameters). Pertanto, di solito usiamo un tentativo separato ... aggiriamo questa impostazione.