Masalah ini tampaknya dimulai sebagai bug dengan perangkat keras tertentu, lihat di sini, tetapi dapat diatasi dengan menggunakan panggilan ke mCamera.setDisplayOrientation (derajat) yang tersedia di API 8. Jadi begini cara saya mengimplementasikannya:
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);
}
}
Ini ada di HTC Desire dan saya awalnya harus memasukkan pernyataan pencatatan di setiap pemeriksaan rotasi untuk mengatakan apa rotasi itu dan kemudian men-debug pada perangkat dan melihat keluaran logCat saat saya memutar perangkat. Untuk HTC Desire, 0 adalah telepon seperti yang Anda harapkan (potret), 90 derajat memutar telepon 90 derajat COUNTER-CLOCKWISE (Saya berasumsi itu searah jarum jam). Dalam kode yang akan Anda lihat, saya tidak perlu melakukan rotasi tampilan saat ponsel berada pada 90 atau 180 derajat - perangkat sepertinya menangani ini sendiri. Hanya satu titik yang tidak berfungsi dengan benar: Rotasi 270 derajat adalah saat Anda memutar perangkat 90 derajat searah jarum jam dan tampilan rotasi berlawanan dengan itu, tetapi jika Anda memutar perangkat 270 derajat berlawanan arah jarum jam, tampaknya tidak mengimbangi dengan benar.
PS Perhatikan pertukaran lebar dan tinggi dalam rotasi yang sesuai.