我正在开发我的自定义相机应用程序,我遇到了方向问题。
当手机处于纵向时,预览屏幕和结果图像以横向显示
当手机处于左横向时,预览屏幕和结果图像显示正确
当手机处于正确的横向方向时,预览屏幕和结果图像以横向模式显示,但垂直翻转
我读过有关使用setDisplayorientation更改方向但我没有设法解决它。
有人可以帮助我吗?
感谢您的帮助
这是开始预览的相机活动代码
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO Auto-generated method stub
System.out.println("!!!!!!!CAMBIO!!!!!!!!" );
initPreview(width, height);
startPreview();
}
private void initPreview(int width, int height) {
if (myCamera!=null && mySurfaceHolder.getSurface()!=null) {
try {
myCamera.setPreviewDisplay(mySurfaceHolder);
}
catch (Throwable t) {
Log.e("PreviewDemo-surfaceCallback",
"Exception in setPreviewDisplay()", t);
Toast
.makeText(CameraHandler.this, t.getMessage(), Toast.LENGTH_LONG)
.show();
}
if (!cameraConfigured) {
Camera.Parameters parameters=myCamera.getParameters();
Camera.Size size=getBestPreviewSize(width, height,
parameters);
if (size!=null) {
parameters.setPreviewSize(size.width, size.height);
myCamera.setParameters(parameters);
cameraConfigured=true;
}
}
}
}
private void startPreview() {
if (cameraConfigured && myCamera!=null) {
myCamera.startPreview();
inPreview=true;
}
}
private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) {
Camera.Size result=null;
for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
System.out.println("Soportados " + size.width + "x" + size.height);
if (size.width<=width && size.height<=height) {
if (result==null) {
result=size;
}
else {
int resultArea=result.width*result.height;
int newArea=size.width*size.height;
if (newArea>resultArea) {
result=size;
}
}
}
}
return(result);
}
答案 0 :(得分:2)
setDisplayorientation()的代码示例位于主文档中:
如果要使摄像机图像显示方向相同 显示,您可以使用以下代码。
public static void setCameraDisplayOrientation(Activity activity,
int cameraId, android.hardware.Camera camera) {
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break;
case Surface.ROTATION_180: degrees = 180; break;
case Surface.ROTATION_270: degrees = 270; break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else { // back-facing
result = (info.orientation - degrees + 360) % 360;
}
camera.setDisplayOrientation(result);
}
从API级别14开始,可以在预览时调用此方法 很活跃。
这不适用于使用Camera.takePicture()拍摄的照片。为此,您可以使用Camera.Parameters.setRotation()。不幸的是,有些设备只根据这个设置EXIF旋转标志,更不幸的是,一些流行的图像浏览器忽略了这个标志。在这种情况下,您必须自己旋转生成的JPEG。为此,您可以使用Java MediaUtil库,例如https://stackoverflow.com/a/15302674/192373