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