この問題は、特定のハードウェアのバグとして始まったようですが、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);
}
}
これはHTCDesireにあり、最初に各ローテーションチェックにログステートメントを入力してローテーションが何であるかを示し、次にデバイスでデバッグし、デバイスをローテーションしている間logCat出力を監視する必要がありました。HTC Desireの場合、0は予想どおりの電話であり(ポートレート)、90度は電話を反時計回りに90度回転させていました(時計回りであると想定していました)。コードでは、電話が90度または180度のときに、ディスプレイを回転させる必要がなかったことがわかります。デバイスはこれを処理しているように見えました。1つのポイントだけが正しく機能していません:270度の回転は、デバイスを時計回りに90度回転させ、ディスプレイの回転カウンターが正常に動作する場合ですが、デバイスを反時計回りに270度回転させると、正しく補正されていないように見えます。
PS適切な回転での幅と高さの入れ替えに注意してください。