2013-12-16 10 views
6

Re-Inicjowanie klienta Camera, robiąc zmianę Podgląd trybów, z poziomego na pionowy lub pionowej na poziomą, mój Surface kod klasy wygląda następująco:Wyłącz Orientacja Zmień

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

} 

mogę wiedzieć, gdzie robię źle, czego brakowało mi w moim kodu?

+0

Musisz zarządzać wysokością i szerokością podglądu również przy zmianie konfiguracji. – TheLittleNaruto

Odpowiedz

12

Musisz zająć się zmianą konfiguracji swojej aplikacji.

Dodaj tę linię do swojego AndroidManifest.xml.

android:configChanges="keyboardHidden|orientation|screenSize" 

ta informuje system, co konfiguracja zmiany będą obsługiwać siebie - w tym przypadku nic nie robi.

Nadzieja pomaga ツ

+1

Dzięki to działa ... – PankajAndroid

+0

świetnie .. szczęśliwy, że to pomaga u :) –

0

To nie wynika z pytaniem co narzekać, ale to wydaje się tylko manipulować parametry kamery, nigdy nie dzwoni mCamera.setParameters(parameters). Samo to może powodować zamieszanie.

Korzystanie parameters.set("orientation", "landscape"); na urządzeniach, które nie obsługują tego parametru może spowodować RuntimeException w mCamera.setParameters(parameters). Dlatego zwykle używamy oddzielnej próby ... złapania wokół tego ustawienia.