我希望在手机旋转时相机的方向不要改变,让相机以任何方向拍摄直立的照片。目前,除了一个方向外,图片在所有方向上都旋转不正确。在HTC Incredible上运行测试2.2:
以下是相机实施的相关代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.camera);
// Set up camera's SurfaceView and SurfaceHolder
surfaceView = (SurfaceView) findViewById(R.id.camera_surface);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Camera.Parameters p = camera.getParameters();
p.setPreviewSize(width,height);
}
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
try {
camera.setPreviewDisplay(surfaceHolder);
} catch (IOException e) {
camera.release();
}
camera.startPreview();
}
由于我希望应用程序与任何等于或高于4的API级别兼容以最大化用户群,因此我更愿意,如果答案没有使用任何特定于更高API级别的内容。谢谢!
答案 0 :(得分:2)
如果您还不希望预览也旋转,请在清单文件中将方向设置为横向或纵向模式。
要获得正确旋转的图像,您需要在camera参数上调用setRotation()(API级别5),然后在调用takePicture API之前设置该参数。您还需要使用orientationEventListener
示例代码here
答案 1 :(得分:0)
试试这个,但我认为这是错误的。我也有这个问题,但在我的情况下,我找不到任何东西。
此代码可以是正确的,当您使用相机预览时可能必须帮助您。
如果没有 - 此代码对您没有帮助。我没有使用相机,所以它没有帮助我。
public void surfaceCreated(SurfaceHolder holder)
{
try
{
camera.setPreviewDisplay(holder);
camera.setPreviewCallback(this);
}
catch (IOException e)
{
e.printStackTrace();
}
Size previewSize = camera.getParameters().getPreviewSize();
float aspect = (float) previewSize.width / previewSize.height;
int previewSurfaceWidth = preview.getWidth();
int previewSurfaceHeight = preview.getHeight();
LayoutParams lp = preview.getLayoutParams();
if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE)
{
// ïîðòðåòíûé âèä
camera.setDisplayOrientation(90);
lp.height = previewSurfaceHeight;
lp.width = (int) (previewSurfaceHeight / aspect);
}
else
{
camera.setDisplayOrientation(0);
lp.width = previewSurfaceWidth;
lp.height = (int) (previewSurfaceWidth / aspect);
}
preview.setLayoutParams(lp);
camera.startPreview();
}
答案 2 :(得分:0)
这应该照顾任何屏幕方向,包括前后摄像头的不同处理方式:
// Set camera rotation (consider display orientation)
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
int displayOrientation = display.getRotation();
int rotation = cameraInfo.orientation;
if (Surface.ROTATION_0 != displayOrientation)
{
if (CameraInfo.CAMERA_FACING_BACK == cameraInfo.facing)
{
if (Surface.ROTATION_90 == displayOrientation)
{
rotation -= 90;
}
else if (Surface.ROTATION_180 == displayOrientation)
{
rotation -= 180;
}
if (Surface.ROTATION_270 == displayOrientation)
{
rotation -= 270;
}
if (rotation < 0)
{
rotation += 360;
}
}
else
{
if (Surface.ROTATION_90 == displayOrientation)
{
rotation += 90;
}
else if (Surface.ROTATION_180 == displayOrientation)
{
rotation += 180;
}
if (Surface.ROTATION_270 == displayOrientation)
{
rotation += 270;
}
rotation %= 360;
}
}
Log.d(TAG, "Camera orientation (" + cameraInfo.orientation + ", " + displayOrientation + ", " + rotation + ")");
cameraParams.setRotation(rotation);