Android 设置正确的方向以预览相机和最终结果图像

Android 设置正确的方向以预览相机和最终结果图像,android,android-camera,Android,Android Camera,我正在开发我的自定义相机应用程序,但我的方向有问题 当手机处于纵向时,预览屏幕和结果图像以横向显示 当手机处于左横向时,预览屏幕和结果图像将正确显示 当手机处于右横向时,预览屏幕和结果图像以横向模式显示,但垂直翻转 我读过有关使用setDisplayorientation更改方向的内容,但我还没有设法修复它 有人能帮我吗 谢谢你的帮助 这是启动预览的摄影机活动的代码 @Override public void surfaceChanged(SurfaceHolder hol

我正在开发我的自定义相机应用程序,但我的方向有问题

当手机处于纵向时,预览屏幕和结果图像以横向显示

当手机处于左横向时,预览屏幕和结果图像将正确显示

当手机处于右横向时,预览屏幕和结果图像以横向模式显示,但垂直翻转

我读过有关使用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);
    }
@覆盖
公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){
//TODO自动生成的方法存根
System.out.println(“!!!!!!!!!CAMBIO!!!!!!!”);
初始预览(宽度、高度);
startPreview();
}
私有void initPreview(整数宽度、整数高度){
if(myCamera!=null&&mySurfaceHolder.getSurface()!=null){
试一试{
myCamera.setPreviewDisplay(mySurfaceHolder);
}
捕获(可丢弃的t){
Log.e(“PreviewDemo surfaceCallback”,
“setPreviewDisplay()中的异常”,t);
干杯
.makeText(CameraHandler.this,t.getMessage(),Toast.LENGTH\u LONG)
.show();
}
如果(!cameraConfigured){
Camera.Parameters=myCamera.getParameters();
Camera.Size Size=getBestPreviewSize(宽度、高度、,
参数);
如果(大小!=null){
parameters.setPreviewSize(size.width、size.height);
myCamera.setParameters(参数);
cameraConfigured=true;
}
}
}
}
私有void startPreview(){
if(cameraConfigured&&myCamera!=null){
myCamera.startPreview();
inPreview=true;
}
}
私人相机。大小getBestPreviewSize(整数宽度、整数高度、相机。参数){
Camera.Size结果=null;
对于(Camera.Size:parameters.getSupportedPreviewSizes()){
System.out.println(“Soportados”+大小.宽度+“x”+大小.高度);
如果(size.width样本代码在主文档中:

如果要使摄影机图像以与相同的方向显示 显示时,可以使用以下代码

从API级别14开始,预览时可以调用此方法 它是活动的


这不适用于使用捕获的图片。为此,您可以使用。不幸的是,一些设备仅根据此设置EXIF旋转标志,更不幸的是,一些流行的图像查看器忽略了此标志。在这种情况下,您必须自己旋转生成的JPEG。为此,您可以使用Java库,请参阅e.g..

f或者语法错误。关于方向,我也有同样的问题。我在帖子中发布了我的解决方案。请检查它将帮助您设置方向。我解决了它,
setRotation
必须在
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);
 }