如果我将左侧基座更改为右侧基座(两者都是用户的横向视图模式),则不会重新创建应用程序(活动)。 Hense,相机显示为水平翻转图像。当我尝试为两种肖像模式(正常和反向)更改设备的位置时,结果相同。该装置正常检测90度旋转。也就是说,左侧=> portrait => right-size => inverse-portrait =>左侧工作正常!
有可能解决这个问题吗?
我使用的是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.
}
答案 0 :(得分:3)
您需要获取相机的支持参数,如下所示:
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
进一步了解this有关OrientationEventListener
希望你会发现这个答案有点用处。