Java 如何旋转android设备相机预览(libgdx)

Java 如何旋转android设备相机预览(libgdx),java,android,camera,libgdx,Java,Android,Camera,Libgdx,我正在使用libgdx制作一个应用程序,我需要使用相机,所以我遵循了教程,我所有的相机馈送都旋转了90度,但它们被绘制得好像它们没有旋转一样。不幸的是,这意味着预览完全失真,很难使用 除非要求提供代码片段,否则我不会在这里发布代码,因为我将教程中的代码复制粘贴到游戏中。。我记得唯一的改变如下 我更改了CameraSurace.java中原来的surfaceCreated()方法 public void surfaceCreated( SurfaceHolder holder ) { /

我正在使用libgdx制作一个应用程序,我需要使用相机,所以我遵循了教程,我所有的相机馈送都旋转了90度,但它们被绘制得好像它们没有旋转一样。不幸的是,这意味着预览完全失真,很难使用

除非要求提供代码片段,否则我不会在这里发布代码,因为我将教程中的代码复制粘贴到游戏中。。我记得唯一的改变如下

我更改了CameraSurace.java中原来的surfaceCreated()方法

 public void surfaceCreated( SurfaceHolder holder ) {
    // Once the surface is created, simply open a handle to the camera hardware.
    camera = Camera.open();
}
打开前向摄像头(Im使用的Nexus 7只有一个前摄像头…)

public void surfaceCreated(SurfaceHolder持有者){
//创建曲面后,只需打开相机硬件的控制柄即可。
摄像头=打开正面摄像头();
}
@SuppressLint(“新API”)
私人摄像机openFrontFacingCamera()
{
int cameraCount=0;
摄像机摄像机=null;
Camera.CameraInfo CameraInfo=新的Camera.CameraInfo();
cameraCount=Camera.getNumberOfCameras();
对于(int-camIdx=0;camIdx

除此之外,代码的其余部分几乎完全相同(不包括小的变量更改等)。

您可以使用
ExifInterface
类来确定与图像关联的
方向标记,并相应地旋转图像

代码如下所示:

ei=新的ExiFinInterface(imagePath);
方向=ei.getAttributeInt(ExifInterface.TAG_方向,
ExiFinInterface.方向(U法线);

开关(方向){
外壳出口接口。方向旋转90:
设置旋转(90);
打破
...
违约:
打破

}

在深入研究camera API时,我发现我所要做的就是使用一个名为
setDisplayOrientation(90)
的好方法,现在它可以完美地工作了

修订守则:

    @SuppressLint("NewApi")
public void surfaceCreated( SurfaceHolder holder ) {
    // Once the surface is created, simply open a handle to the camera hardware.
    camera = openFrontFacingCamera();
    camera.setDisplayOrientation(90);
}


@SuppressLint("NewApi")
private Camera openFrontFacingCamera() 
{
    int cameraCount = 0;
    Camera cam = null;
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    cameraCount = Camera.getNumberOfCameras();
    for ( int camIdx = 0; camIdx < cameraCount; camIdx++ ) {
        Camera.getCameraInfo( camIdx, cameraInfo );
        if ( cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT  ) {
            try {
                cam = Camera.open( camIdx );
            } catch (RuntimeException e) {
                System.out.println("Falied to open.");
            }
        }
    }

    return cam;
}
@SuppressLint(“NewApi”)
已创建的公共空白表面(表面持有人){
//创建曲面后,只需打开相机硬件的控制柄即可。
摄像头=打开正面摄像头();
摄像头。设置显示方向(90);
}
@SuppressLint(“新API”)
私人摄像机openFrontFacingCamera()
{
int cameraCount=0;
摄像机摄像机=null;
Camera.CameraInfo CameraInfo=新的Camera.CameraInfo();
cameraCount=Camera.getNumberOfCameras();
对于(int-camIdx=0;camIdx

另外,我之所以忽略
NewApi
的唯一原因是因为我知道这个应用程序将运行在哪个设备上,而且它是特定于那个设备的。。。除非您知道设备的API足够高,否则不推荐使用。。。(它只需要API 8)

如果说“imagePath”,我想你是指保存的图像?直到最后,图像才保存。对于我正在做的事情,拍摄照片时的方向是什么并不重要,只是在预览结束时showing@Duck对不起,伙计。。误解了你的问题!不用担心,伙计,一切都很好,也许有一天会派上用场,谁知道呢:)
    @SuppressLint("NewApi")
public void surfaceCreated( SurfaceHolder holder ) {
    // Once the surface is created, simply open a handle to the camera hardware.
    camera = openFrontFacingCamera();
    camera.setDisplayOrientation(90);
}


@SuppressLint("NewApi")
private Camera openFrontFacingCamera() 
{
    int cameraCount = 0;
    Camera cam = null;
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    cameraCount = Camera.getNumberOfCameras();
    for ( int camIdx = 0; camIdx < cameraCount; camIdx++ ) {
        Camera.getCameraInfo( camIdx, cameraInfo );
        if ( cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT  ) {
            try {
                cam = Camera.open( camIdx );
            } catch (RuntimeException e) {
                System.out.println("Falied to open.");
            }
        }
    }

    return cam;
}