1. ホーム
  2. android

[解決済み] Android - カメラのプレビューが横向きになっている

2022-08-08 20:30:17

質問

カメラが見ているものを画面に表示するためにプレビューを使用しています。

サーフェイスの作成、サーフェイスの設定、サーフェイスの表示と、すべてうまく動作しています。

しかし、ポートレート モードでは、常に不正確な 90 度の角度で画像が表示されます。

写真のような

以下のコードを使用すると、画像がまっすぐになることは承知しています。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

しかし、私はプレビューを他の要素を含むアクティビティ内に持っており、私のアクティビティがランドスケープモードで表示されることは意味を成しません。(デフォルトでは無効になっています)

そこで、プレビューの方向を変更する方法はないでしょうか。そして、私の活動の残りの部分はポートレート モードで正しく表示されたままにしておくことはできますか?

または、正しく表示されるようにプレビューを回転させる方法はありますか?

どのように解決するのですか?

この問題は、あるハードウェアのバグとして始まったようです。 こちらをご覧ください。 が、API 8 で利用可能な mCamera.setDisplayOrientation(degrees) の呼び出しを使用することによって克服することができます。そのため、私はこの方法で実装しています。

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {            
    if (isPreviewRunning) {
        mCamera.stopPreview();
    }

    Parameters parameters = mCamera.getParameters();
    Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

    if(display.getRotation() == Surface.ROTATION_0) {
        parameters.setPreviewSize(height, width);                           
        mCamera.setDisplayOrientation(90);
    }

    if(display.getRotation() == Surface.ROTATION_90) {
        parameters.setPreviewSize(width, height);                           
    }

    if(display.getRotation() == Surface.ROTATION_180) {
        parameters.setPreviewSize(height, width);               
    }

    if(display.getRotation() == Surface.ROTATION_270) {
        parameters.setPreviewSize(width, height);
        mCamera.setDisplayOrientation(180);
    }

    mCamera.setParameters(parameters);
    previewCamera();                      
}

And the previewCamera method :

public void previewCamera() {        
    try {           
        mCamera.setPreviewDisplay(mSurfaceHolder);          
        mCamera.startPreview();
        isPreviewRunning = true;
    } catch(Exception e) {
        Log.d(APP_CLASS, "Cannot start preview", e);    
    }
}

これは HTC Desire 上でのことで、私は当初、回転が何であるかを言うために、それぞれの回転チェックにロギング ステートメントを入れなければなりませんでした。そして、デバイス上でデバッグし、デバイスを回転させながら logCat 出力を見ました。HTC Desireの場合、0度は期待通りの携帯電話(縦向き)、90度は携帯電話を90度反時計回りに回転させました(私は時計回りに回転させると想定していたのです)。このコードでは、携帯電話が90度や180度になったときにディスプレイを回転させる必要がないことがわかると思いますが、これはデバイスが自分で処理しているようです。ただ一点、正常に動作していない点があります。270 度の回転は、デバイスを時計回りに 90 度回転させたときで、ディスプレイの回転は OK ですが、デバイスを反時計回りに 270 度回転させた場合は、適切に補正されないようです。

追記: 適切な回転で幅と高さが入れ替わっていることに注意してください。