2013-12-16 6 views
6

再起動カスタムカメラ、風景に縦または縦に風景からプレビューモードの変化をしながら、私の表面クラスのコードは次のようになります。を無効にオリエンテーションを変更

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

} 

私は私のコードで逃したものを、私が間違っているの場所を知ることはできますか?

+0

設定の変更時にプレビューの高さと幅を管理する必要があります。 – TheLittleNaruto

答えて

12

アプリの設定変更を処理する必要があります。

この行をAndroidManifest.xmlに追加します。

android:configChanges="keyboardHidden|orientation|screenSize" 

これは、あなたが自分で処理しようとしている構成の変更をシステム告げる - 何もしないことで、この場合には。

は、それはそれはあなたが文句を言う何をあなたの質問から明らかではありませんが、あなただけのカメラパラメータを操作しているように見える、mCamera.setParameters(parameters)を呼び出すことはありません

+1

ありがとうございました... – PankajAndroid

+0

素晴らしい..幸せに役立ちます。 –

0

ツお役に立てば幸いです。これだけで混乱の原因となることがあります。

このパラメータをサポートしていないデバイスでparameters.set("orientation", "landscape");を使用すると、RuntimeExceptionmCamera.setParameters(parameters)になることがあります。したがって、通常はこの設定を別のtry ... catchを使用します。

関連する問題