纵向模式下的相机预览方向(samsung设备)
我正在使用相机显示预览。 该应用始终处于肖像模式(横向模式已禁用)。 相机预览始终旋转90度ccw,我无法更改它(既没有使用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);
}
}
这是我对SurfaceHolder.Callback的surfaceCreated方法的实现,它工作正常,请检查你是否在你的实现中缺少任何东西
public void surfaceCreated(SurfaceHolder holder) {
// The Surface has been created, acquire the camera and tell it where
// to draw.
try {
Log.d(TAG, "surfaceCreated(), holder"+holder.toString());
mCamera = null;
mCamera = Camera.open();
Log.d(TAG, "surfaceCreated(), mCamera="+mCamera);
mCamera.setDisplayOrientation(90);
mCamera.setPreviewDisplay(holder);
Camera.Parameters params= mCamera.getParameters();
params.set("jpeg-quality", 72);
params.set("rotation", 90);
params.set("orientation", "portrait");
params.setPictureFormat(PixelFormat.JPEG);
mCamera.setParameters(params);
createZoomlayout();
} catch (Exception e) {
Toast.makeText(CameraInterface.this,
" surfaceCreated " + e.getMessage(), Toast.LENGTH_LONG)
.show();
e.printStackTrace();
}
}
使用 - setDisplayOrientation(90); 如果它没有工作,请回复..
链接地址: http://www.djcxy.com/p/41845.html上一篇: Camera preview orientation in portrait mode (samsung device)
下一篇: Zxing issue with the portrait mode for the Samsung Galaxy Note