`

让Camera在portrait模式下不旋转90度

阅读更多
由于Android自身的关系,camera必须在landscape模式下才可以显示正常,如果是在portrait模式下,就要把脖子转90度才能“正常”观看了

听说Android的SDK升级到1.5(cupcake)后已经可以解决这个问题了,就上网找了一下,发现有些人说可以尝试使用parameters.set("rotation", 90),试了一下,无效。

最近由于项目原因,继续研究了下,找到了一个“曲线救国”的方法
parameters.set("orientation", "portrait");

由于这个方法没有出现在Android的官方的api文档中,所以可能会有些问题。。。吧
谁知道呢,先用着再说

(哎,这个方法被2.0毙了)

-----------------------更新-----------------------

通过反射,貌似可以解决预览
1.5 - OK
1.6 - OK
2.2 - OK
2.3 - OK
4.0 - OK
其余的没有测试,希望有能力的朋友帮忙测一下,然后给个结果

public class CameraView extends SurfaceView implements SurfaceHolder.Callback {

	/**
	 * This is a holder that holding a display surface.
	 */
	private SurfaceHolder mHolder = null;

	private int sdk = 3;

	/**
	 * This is a camera object using for connect/disconnect with the camera
	 * service,and so on.
	 */
	private Camera mCamera;

	/**
	 * Perform inflation from XML and apply a class-specific base style. This
	 * constructor of View allows subclasses to use their own base style when
	 * they are inflating.
	 * 
	 * @param context
	 *            The Context the view is running in, through which it can
	 *            access the current theme, resources, etc.
	 * @param attrs
	 *            The attributes of the XML tag that is inflating the view.
	 * @param defStyle
	 *            The default style to apply to this view. If 0, no style will
	 *            be applied (beyond what is included in the theme). This may
	 *            either be an attribute resource, whose value will be retrieved
	 *            from the current theme, or an explicit style resource.
	 */
	public CameraView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}

	/**
	 * Constructor that is called when inflating a view from XML. This is called
	 * when a view is being constructed from an XML file, supplying attributes
	 * that were specified in the XML file. This version uses a default style of
	 * 0, so the only attribute values applied are those in the Context's Theme
	 * and the given AttributeSet.
	 * 
	 * @param context
	 *            The Context the view is running in, through which it can
	 *            access the current theme, resources, etc.
	 * @param attrs
	 *            The attributes of the XML tag that is inflating the view.
	 */
	public CameraView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	/**
	 * Simple constructor to use when creating a view from code.
	 * 
	 * @param context
	 *            The Context the view is running in, through which it can
	 *            access the current theme, resources, etc.
	 */
	public CameraView(Context context) {
		super(context);
		init();
	}

	public void init() {
		if (mHolder == null) {
			mHolder = getHolder();
			mHolder.addCallback(this);
			mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

			sdk = getSDKInt();
		}
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {

		try {

			// rotate camera 90 degree on portrait mode
			if (getContext().getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {

				if (sdk <= 4) {

					// 1.5 & 1.6
					Camera.Parameters parameters = mCamera.getParameters();
					parameters.set("orientation", "portrait");
					mCamera.setParameters(parameters);
				} else {
					setDisplayOrientation(mCamera, 90);
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

		startPreview();
	}

	/**
	 * rotate camera with any degree, only available for SDK 5 and later
	 * 
	 * @param camera
	 * @param angle
	 */
	private void setDisplayOrientation(Camera camera, int angle) {
		Method downPolymorphic;

		if (sdk <= 4)
			return;

		try {
			if (sdk > 4 && sdk < 8) {

				// parameters for pictures created by a Camera service.
				Camera.Parameters parameters = mCamera.getParameters();

				// 2.0, 2.1
				downPolymorphic = parameters.getClass().getMethod(
						"setRotation", new Class[] { int.class });
				if (downPolymorphic != null)
					downPolymorphic.invoke(parameters, new Object[] { angle });

				// Sets the Parameters for pictures from this Camera
				// service.
				mCamera.setParameters(parameters);

			} else {

				downPolymorphic = camera.getClass().getMethod(
						"setDisplayOrientation", new Class[] { int.class });
				if (downPolymorphic != null)
					downPolymorphic.invoke(camera, new Object[] { angle });
			}
		} catch (Exception e) {
		}
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {

		// get Camera object.
		try {
			mCamera = Camera.open();
			mCamera.setPreviewDisplay(holder);

		} catch (RuntimeException e) {
			e.printStackTrace();
			releaseCamera();
		} catch (IOException e) {
			e.printStackTrace();
			releaseCamera();
		}
	}

	public void stopPreview() {
		if (mCamera != null) {
			mCamera.stopPreview();
		}
	}

	public void startPreview() {
		if (mCamera != null) {
			mCamera.startPreview();
		}
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		releaseCamera();
	}

	private void releaseCamera() {
		if (mCamera != null) {
			mCamera.stopPreview();
			mCamera.release();
		}
		mCamera = null;
		System.gc();
	}

	private int getSDKInt() {
		// this is safe so that we don't need to use SDKInt which is only
		// available after 1.6
		try {
			return Integer.parseInt(Build.VERSION.SDK);
		} catch (Exception e) {
			return 3; // default to target 1.5 cupcake
		}
	}
}
分享到:
评论
2 楼 dai_lm 2010-03-29  
biAji 写道
http://code.google.com/p/android/issues/detail?id=1193

thanks, I have fixed the problem.
1 楼 biAji 2010-03-21  
http://code.google.com/p/android/issues/detail?id=1193

相关推荐

    Android Zxing 扫描条码实现竖屏模式(portrait mode) 摄像头camera 旋转90度

    本篇文章将详细讲解如何在Android应用中使用ZXing库实现竖屏模式下的条码扫描功能,同时解决摄像头旋转90度的问题。 首先,我们需要在项目中集成ZXing库。可以通过Gradle依赖或者下载ZXing的源码将其添加到项目中。...

    Android Zxing 扫描条码实现竖屏模式

    最后,`Android Zxing 扫描条码实现竖屏模式(portrait mode) 摄像头camera 旋转90度.txt`文档很可能是详细的实现步骤或代码示例。它可能包含了如何在ZXing库基础上进行修改,以适应竖屏扫描和旋转相机的详细说明。 ...

    android之camera用法实例详解

    当尝试在竖屏(portrait layout)模式下使用Camera API时,可能会遇到两个主要问题:图像倾斜90度和长宽比例失真。这是由于Android底层处理摄像头数据的方式导致的。摄像头采集的原始图像数据是按照横屏模式进行的,...

    Camera预览方向例子

    这些方向在不同的设备和用户交互模式下可能会变化。 Camera预览方向的核心在于正确设置Camera对象的DisplayOrientation。DisplayOrientation并不是设备物理上的旋转角度,而是相机预览图像相对于屏幕的方向。通常,...

    Android Camera 方向

    在Android平台上,相机(Camera)方向是一个常见的开发问题,涉及到设备的传感器、屏幕布局以及如何适当地捕捉和显示图像。本文将深入探讨Android相机方向的相关知识点,并基于提供的资源文件列表进行解析。 首先,...

    Zxing2.1竖屏完美设置

    总结来说,为了让ZXing 2.1在竖屏模式下正常工作,我们需要修改四个关键部分:AndroidManifest.xml中的屏幕方向设置,DecodeHandler.java中的图像旋转处理,CameraManager.java中的取景框尺寸计算,以及...

    zxing 坚屏扫描实现

    在CameraConfigurationManager.java的`setDesiredCameraParameters(Camera camera)`方法中,加入`camera.setDisplayOrientation(90);`以使相机预览画面适应竖屏。 5. **调整CameraConfigurationManager的...

    四步将ZXing横屏改竖屏方法.pdf

    然而,在一些情况下,开发者会遇到ZXing库中的屏幕方向设置问题,导致扫描界面显示不友好。本文介绍了如何通过修改ZXing源代码,将默认的横屏扫描界面改为竖屏扫描,具体以Delphi环境和Android平台为例,逐步说明了...

    UIImagePickerController

    在iOS开发中,`UIImagePickerController` 是苹果提供的一个关键组件,用于让用户从设备的相册或者直接通过摄像头拍照来获取图片。这个组件对于许多应用程序来说是不可或缺的,特别是那些需要用户上传或选择个人照片...

    Android Zxing 转换竖屏扫描且提高识别率的方法

    3. 在`CameraConfigurationManager`类的`setDesiredCameraParameters(OpenCamera camera, boolean safeMode)`方法中,设置摄像头的显示方向为90度,以便正确显示预览图像: ```java theCamera....

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    4.24 动态旋转图片——Bitmap与Matrix旋转ImageView 4.25 猜猜我在想什么——RadioButtonID 4.26 离开与关闭程序的弹出窗口——对话窗口上的ICON图标 第5章 交互式通信服务与手机控制 5.1 具有正则表达式的TextView...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    4.24 动态旋转图片——Bitmap与Matrix旋转ImageView 4.25 猜猜我在想什么——RadioButtonID 4.26 离开与关闭程序的弹出窗口——对话窗口上的ICON图标 第5章 交互式通信服务与手机控制 5.1 具有正则表达式的TextView...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    4.24 动态旋转图片——Bitmap与Matrix旋转ImageView 4.25 猜猜我在想什么——RadioButtonID 4.26 离开与关闭程序的弹出窗口——对话窗口上的ICON图标 第5章 交互式通信服务与手机控制 5.1 具有正则表达式的TextView...

    Google Android SDK开发范例大全的目录

    4.24 动态旋转图片——Bitmap与Matrix旋转ImageView 4.25 猜猜我在想什么——RadioButtonID 4.26 离开与关闭程序的弹出窗口——对话窗口上的ICON图标 第5章 交互式通信服务与手机控制-p155 5.1 具有正则表达式的...

    Google+Android+SDK开发范例大全

    4.22 加载手机磁盘里的图文件——使用decodeFile方法 4.23 动态放大缩小ImageView里的图片——运用Matrix对象来缩放图文件 4.24 动态旋转图片——Bitmap与Matrix旋转ImageView 4.25 猜猜我在想什么——...

    Google Android SDK开发范例大全(完整版附部分源码).pdf

    4.24 动态旋转图片——Bitmap与Matrix旋转ImageView 4.25 猜猜我在想什么——RadioButtonID 4.26 离开与关闭程序的弹出窗口——对话窗口上的ICON图标 第5章 交互式通信服务与手机控制 5.1 具有正则表达式的...

    Google Android sdk 开发范例大全 部分章节代码

    4.24 动态旋转图片——Bitmap与Matrix旋转ImageView 4.25 猜猜我在想什么——RadioButtonID 4.26 离开与关闭程序的弹出窗口——对话窗口上的ICON图标 第5章 交互式通信服务与手机控制-p155 5.1 具有正则表达式的...

    Google Android SDK 开发范例大全01

    4.24 动态旋转图片——Bitmap与Matrix旋转ImageView 4.25 猜猜我在想什么——RadioButtonID 4.26 离开与关闭程序的弹出窗口——对话窗口上的ICON图标 第5章 交互式通信服务与手机控制-p155 5.1 具有正则表达式的...

Global site tag (gtag.js) - Google Analytics