ปัญหานี้ดูเหมือนจะเริ่มต้นจากข้อผิดพลาดกับฮาร์ดแวร์บางตัวดูที่นี่แต่สามารถเอาชนะได้โดยใช้การเรียกไปที่ mCamera.setDisplayOrientation (degrees) ที่มีอยู่ใน API 8 ดังนั้นนี่คือวิธีที่ฉันใช้:
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 องศา COUNTER-CLOCKWISE (ฉันคิดว่ามันน่าจะเป็นตามเข็มนาฬิกา) ในรหัสคุณจะเห็นว่าฉันไม่จำเป็นต้องหมุนหน้าจอใด ๆ เมื่อโทรศัพท์อยู่ที่ 90 หรือ 180 องศา - ดูเหมือนว่าอุปกรณ์จะจัดการได้เอง มีเพียงจุดเดียวเท่านั้นที่ทำงานไม่ถูกต้อง: การหมุน 270 องศาคือเมื่อคุณหมุนอุปกรณ์ตามเข็มนาฬิกา 90 องศาและตัวนับการหมุนจอแสดงผลที่ใช้ได้ แต่ถ้าคุณหมุนอุปกรณ์ 270 องศาทวนเข็มนาฬิกาดูเหมือนว่าจะชดเชยไม่ถูกต้อง
ปล. สังเกตการสลับความกว้างและความสูงในการหมุนที่เหมาะสม