我的应用程序在纵向模式下运行,作为其中一个活动的一部分,我有一个摄像头对象作为片段在其中运行。
我可以选择从前置摄像头切换到后置摄像头,在使用后置摄像头拍照时一切正常。
但是当我使用前置摄像头拍照时,它们会被倒转180度。现在我知道这可能与方向处于纵向模式有关,但如果将其放在横向模式下,那就会毁掉我的应用程序的想法。
是否有任何方法可以修复此问题,使拍摄的图片与预览中看到的相同?
listener = new OrientationEventListener(this.getActivity(),SensorManager.SENSOR_DELAY_NORMAL){
@Override
public void onOrientationChanged(int orientation) {
// TODO Auto-generated method stub
if (orientation == ORIENTATION_UNKNOWN) return;
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(mCurrentCamera, info);
orientation = (orientation + 45) / 90 * 90;
int rotation = 0;
if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
rotation = (info.orientation - orientation + 360) % 360;
} else { // back-facing camera
rotation = (info.orientation + orientation) % 360;
}
if (mCamera.getParameters() != null){
Camera.Parameters mParameters = mCamera.getParameters();
mParameters.setRotation(rotation);
mCamera.setParameters(mParameters);
}
}
};
listener.enable();
if (listener.canDetectOrientation())
Log.d("Orientation Possible", "Orientation Possible");
问题是,当我尝试拍照时,程序会崩溃。即使在预览模式下运行一段时间后也会再次崩溃。还应该补充一点,在另一个方法中我正在做这个操作。
public void switchCamera(Camera camera) {
setCamera(camera);
try {
camera.setPreviewDisplay(mHolder);
} catch (IOException exception) {
Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);
}
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
requestLayout();
try{
camera.setParameters(parameters);
}
catch (RuntimeException ex){
Log.d("Preview", "Failure to set proper parameters");
//need to improve this method
if (mSupportedPreviewSizes != null) {
Camera.Size cs = mSupportedPreviewSizes.get(0);
parameters.setPreviewSize(cs.width, cs.height);
camera.setParameters(parameters);
requestLayout();
//int tempheight = mPreviewSize.height;
//mPreviewSize.height = mPreviewSize.width;
//mPreviewSize.width = tempheight;
}
}
当你在摄像头之间切换时(从后置摄像头切换到前置摄像头或反之亦然),就会调用这个函数。这是否会干扰方向事件监听器?
此外,在保存拍摄的照片时,这是我调用的功能。以前它只接受数据作为参数,但我尝试让它也接受屏幕方向。问题是无论如何屏幕方向始终为90度。因此,位图将永远旋转90度(这对于使用后置摄像头拍照非常好),但当使用前置摄像头拍摄时会翻转它。是否可以在此函数中实现修复?
public static Bitmap MakeSquare(byte[] data, int orientation) {
int width;
int height;
// Rotate photo
Matrix matrix = new Matrix();
matrix.postRotate(orientation);
// Convert ByteArray to Bitmap
Bitmap bitPic = BitmapFactory.decodeByteArray(data, 0, data.length);
width = bitPic.getWidth();
height = bitPic.getHeight();
// Create new Bitmap out of the old one
Bitmap bitPicFinal = Bitmap.createBitmap(bitPic, 0, 0, width, height,matrix, true);
bitPic.recycle();
int desWidth;
int desHeight;
desWidth = bitPicFinal.getWidth();
desHeight = desWidth;
Bitmap croppedBitmap = Bitmap.createBitmap(bitPicFinal, 0,bitPicFinal.getHeight() / 2 - bitPicFinal.getWidth() / 2,desWidth, desHeight);
croppedBitmap = Bitmap.createScaledBitmap(croppedBitmap, 528, 528, true);
return croppedBitmap;
}