Android旋转180度无法正常工作

3
如果我将left-side-base更改为right-side-base(两者都是用户的横向视图模式),应用程序(活动)不会重新创建。因此,相机显示为水平翻转的图像。当我尝试更改设备位置以获得两个纵向模式(正常和反向)时,结果相同。设备通常检测到90度旋转。也就是说,left-side => portrait => right-size => inverse-portrait => left-side可以正确工作! 有没有可能修复这个问题? 我正在使用Android 4.4.4。 代码:
    Display display = ((WindowManager)context.getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

    if(display.getRotation() == Surface.ROTATION_0){//0

        mCamera.setDisplayOrientation(90);
    }else if(display.getRotation() == Surface.ROTATION_90){//1
        mCamera.setDisplayOrientation(0);
    }else if(display.getRotation() == Surface.ROTATION_180){//2
        mCamera.setDisplayOrientation(270);
    }else if(display.getRotation() == Surface.ROTATION_270){//3
        mCamera.setDisplayOrientation(180);
    }
    Log.d(TAG, "ROTATION:" + display.getRotation() + " ");

编辑 我的意思是,当我将设备旋转180度时,onResume()SurfaceCreate()没有被调用。

函数的编辑代码

SurfaceView sfv;
FrameLayout fl0;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //some code to initialize
    fl0 = (FrameLayout) findViewById(R.id.fl0);
    sfv = new SurfaceView(this);
    fl0.addView(sfv, 0);
    addSurfaceHolder();
}
private void addSurfaceHolder() {
    SurfaceHolder holder = sfv.getHolder();

    holder.addCallback(new SurfaceHolder.Callback() {


        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            Log.d(TAG, TAG + " surfaceCreated");
            //this function never calls for 180 deg rotation.
            cameraStart(MainActivity.this, false);
            //some code for camera holder connection
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format,
            int width, int height) {
            Log.d(TAG, TAG + " surfaceChanged");
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            ///Some code to destroy camera
            Log.d(TAG, TAG + " surfaceDestroyed");
        }
    });
}
@Override
protected void onResume() {
    super.onResume();
    Log.d(TAG, TAG + " onResume"); //call for 90 deg rotation. not for 180 deg rotation.
}

public static void cameraStart(Context context, boolean startStopPreview) {

    if (mCamera == null) {
        mCamera = Camera.open(CAMERA_ID); //0
    }

    Camera.Parameters cameraParam = mCamera.getParameters();

    Camera.Size previewSize = cameraParam.getPreviewSize();
    previewFormat = cameraParam.getPreviewFormat();
    frameWidth = previewSize.width;
    frameHeight = previewSize.height;
    frameRect = new Rect(0, 0, frameWidth, frameHeight);

    Display display = ((WindowManager) context.getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

    if (display.getRotation() == Surface.ROTATION_0) { //0

        mCamera.setDisplayOrientation(90);
    } else if (display.getRotation() == Surface.ROTATION_90) { //1

        mCamera.setDisplayOrientation(0);
    } else if (display.getRotation() == Surface.ROTATION_180) { //2

        mCamera.setDisplayOrientation(270);
    } else if (display.getRotation() == Surface.ROTATION_270) { //3

        mCamera.setDisplayOrientation(180);
    }
    Log.d(TAG, "ROTATION:" + display.getRotation() + " "); //just calles for 90 deg rotation. not for 180 deg.
}

将一些代码作为“如何”发布,以说明您刚才所说的内容。 - Sharp Edge
1
你尝试过使用 OrientationEventListener 吗? - Sharp Edge
1
请参考这个问题,了解有关OrientationEventListener的一些提示。 - Sharp Edge
谢谢。它有效。但是实现和捕获所有状态相对困难。你可以将这个作为答案写下来,我会接受为正确的。 - Vyacheslav
是的,它的实现方式非常令人恼火。你能给我的答案投一票吗?我会非常感激的。谢谢。 - Sharp Edge
显示剩余2条评论
1个回答

5
你需要像这样获取相机的支持参数:
Camera.Parameters parameters = camera.getParameters();

mCamera.setDisplayOrientation(int); 前添加以下这行代码。
parameters.setRotation(int);

举个例子:

if(display.getRotation() == Surface.ROTATION_0){//0
    parameters.setRotation(90);
    mCamera.setDisplayOrientation(90);
}else if(display.getRotation() == Surface.ROTATION_90){//1
    parameters.setRotation(0);
    mCamera.setDisplayOrientation(0);
}else if(display.getRotation() == Surface.ROTATION_180){//2
    parameters.setRotation(270);
    mCamera.setDisplayOrientation(270);
}else if(display.getRotation() == Surface.ROTATION_270){//3
    parameters.setRotation(180);
    mCamera.setDisplayOrientation(180);
}

希望这能回答您的问题。

编辑

以上代码还需要在onResume()方法中出现,因为每次更改方向时都会调用onDestroy()然后再调用onCreate(),所以onResume()也需要有这段代码,以及onCreate()

编辑2

请查看OrientationEventListener了解更多信息。

此外,可以查看问题,以获取有关OrientationEventListener的提示。

希望您会发现这个答案有点有用。


很遗憾,不行。程序无法重新创建。 - Vyacheslav
你尝试使用另一台设备了吗?你用哪个设备来测试这个? - Sharp Edge
还有一个问题,你准备把这段代码片段放在哪里? - Sharp Edge
surfaceCreated() 方法已经调用,但 onResume 方法还未被调用。 - Vyacheslav
请发布您完整的相关代码,我相信这不是一个高度机密的政府项目,这样我可以更好地帮助您。 - Sharp Edge
更新了主贴。 - Vyacheslav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接