我正在使用相机显示预览。该应用程序始终处于纵向模式(禁用横向模式)。相机预览始终逆时针旋转 90 度,我无法更改它(无论是使用 setDisplayOrientation 还是使用 p.set("orientation", "portrait" ) 和 p.set("rotation", 90) )。
预览总是像这样旋转还是取决于设备?如果在纵向模式下总是这样,我可以在之后旋转图像。
我将手机置于“纵向模式”,但 cameraPreview 处于横向模式(即我看到旋转了 90 度的东西)。
在许多设备上都能正常工作 LG Optimus 三星 Galaxy S2
某些三星设备的问题 (SAMSUNG GALAXY ACE DUOS)
/*
Copyright Sergi Martínez (@sergiandreplace)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package com.appunta.android.ui;
import java.io.IOException;
import java.lang.reflect.Method;
import android.content.Context;
import android.hardware.Camera;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Display;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.View;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.WindowManager;
public class CameraView extends SurfaceView implements Callback {
Camera camera;
SurfaceHolder previewHolder;
private boolean isPreviewRunning;
public CameraView(Context ctx) {
super(ctx);
init();
}
private void init() {
previewHolder = this.getHolder();
previewHolder.addCallback(this);
previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public CameraView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CameraView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
setCameraDisplayOrientation(camera);
try {
camera.setPreviewDisplay(holder);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
camera.startPreview();
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
if (isPreviewRunning) {
camera.stopPreview();
}
setCameraDisplayOrientation(camera);
previewCamera();
}
public void previewCamera() {
try {
camera.setPreviewDisplay(previewHolder);
camera.startPreview();
isPreviewRunning = true;
} catch (Exception e) {
}
}
public void surfaceDestroyed(SurfaceHolder arg0) {
camera.stopPreview();
camera.release();
}
public void startCamera() {
previewCamera();
}
public void stopCamera() {
camera.stopPreview();
camera.release();
}
protected static void setDisplayOrientation(Camera camera, int angle) {
Method downPolymorphic;
try {
downPolymorphic = camera.getClass().getMethod(
"setDisplayOrientation", new Class[] { int.class });
if (downPolymorphic != null)
downPolymorphic.invoke(camera, new Object[] { angle });
} catch (Exception e1) {
}
}
private void setCameraDisplayOrientation(Camera camera) {
// android.hardware.Camera.CameraInfo info = new
// android.hardware.Camera.CameraInfo();
// android.hardware.Camera.getCameraInfo(0, info);
// Display display = ((WindowManager) getContext().getSystemService(
// Context.WINDOW_SERVICE)).getDefaultDisplay();
// int rotation = display.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;
// }
// setDisplayOrientation(camera, result);
setDisplayOrientation(camera, 90);
}
}