0

カメラを使ったAndroidアプリを開発しています。surfaceChanged()メソッドで問題が発生しました。これが私のコードです。

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    Log.e(TAG, "surfaceChanged");

    if (mPreviewRunning) {
        mCamera.stopPreview();
    }

    Camera.Parameters parameters = mCamera.getParameters();

    parameters.setPreviewSize(w, h);
    mCamera.setParameters(parameters);
    try {
        mCamera.setPreviewDisplay(holder);
    } catch (IOException e) {
        e.printStackTrace();
    }
    mCamera.startPreview();
    mPreviewRunning = true;
}

変数mPreviewRunningは、最初はfalseとして初期化されます。プログラムは水平方向で問題なく実行されます。しかし、電話を垂直方向に回転させると、画面が回転して引き伸ばされます。なぜ起こったのか理解できません。この問題を解決するのを手伝ってください。

4

1 に答える 1

1

カメラは向きをまったく変更しません-CCDはマザーボードにはんだ付けされており、横向きモードであるかのようにピクセルを配信します(おそらく)。ただし、マニフェストで無効にしない限り、向きを変更するとOSによってアクティビティが再開される可能性があります。

(そして、この再起動時にサーフェスビューが再作成されます)

カメラ管理を処理するAndroidデモについては、このプロジェクトをご覧ください。

https://sourceforge.net/p/javaocr/source/ci/5cb9b4176f40ada57296cce79addd205e4c1405c/tree/demos/camera-utils/src/main/java/net/sf/javaocr/demos/android/utils/camera/CameraManager.java# l85

あなたの間違いは、表面サイズからプレビューサイズを設定することです-これをしないでください。カメラは許容可能なプレビューサイズの限られたセットを提供し、他の設定を無視することができます(正確な動作はデバイスによって異なります)

プレビューサイズとは、使用されているCCD解像度を意味し、カメラソフトウェアは、必要に応じて、表面ビューのスケーリングのサイズで表面ビューにレンダリングします。

于 2013-01-16T15:55:01.983 に答える