我正在使用预览来显示相机在屏幕上看到的内容.
我可以使一切工作正常,表面创建,表面设置和表面显示.
但是,在纵向模式下,它始终以不正确的90度角显示图像.
如图中所示:

我知道使用以下代码将直接设置图片:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Run Code Online (Sandbox Code Playgroud)
但是我在Activity中有预览,其中包含其他元素,并且我的Activity在横向模式下显示没有意义.(默认禁用)
所以我想知道是否只是改变预览的方向?并在"纵向"模式下正确显示我的其余活动?
或者无论如何旋转预览以便正确显示?
我想根据Android中的设备方向设置相机方向,但似乎没有任何效果.我尝试旋转Surface以及相机参数,但是纵向模式下的相机预览总是颠倒过来.我需要顺时针旋转90度才能使其正确.这是我现在使用的代码,仅适用于横向模式.
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
camera = null;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
initCamera();
}
private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.2;
double targetRatio = (double) w / h;
if (sizes == null)
return null;
Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
// Try to find an size match aspect ratio and size
for (Size size …Run Code Online (Sandbox Code Playgroud) 我想portrait在Zxing相机上显示方向.
如何才能做到这一点?
好的,我有一个扩展SurfaceView和覆盖的类
surfaceChanged - 只需调用startPreview
surfaceCreated - 打开相机,编辑params*,设置surfaceHolder
surfaceDestroyed - 调用stopPreview,释放相机
这一切都很有效,因为当方向是肖像:
来自surfaceCreated*
m_camera = Camera.open();
Camera.Parameters p = m_camera.getParameters();
if (getResources().getConfiguration().orientation !=
Configuration.ORIENTATION_LANDSCAPE)
{
p.set("orientation", "portrait");
// CameraApi is a wrapper to check for backwards compatibility
if (CameraApi.isSetRotationSupported())
{
CameraApi.setRotation(p, 90);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,每次方向改变时,它都会调用Camera.open()......正如您所知,这是一项非常昂贵的操作,导致转换不是那么顺利.
当我强制定位到横向时,预览很棒.创建只调用一次,因为预览是横向的,相机始终是用户看到的.但是,我需要一种方法来设置纵向拍摄时实际拍摄的照片的方向.当我强制横向渲染时,表面永远不会被重新创建,并且当相机以纵向方式保持时,参数永远不会被设置.
那么如何才能完成以下任一项(专门)?
当方向发生变化时,保持 onDestroy和onCreate之间的m_camera,以便过渡平滑
强制风景和检测方向改变另一种方式...旋转最终的snaped图片,如果保持纵向.
此外,如果我离开基地,有人能指出我更好的方向吗?谢谢.
android smartphone orientation android-sdk-2.1 android-camera
我正在使用相机仅显示预览(不拍照或录制视频).
应用程序始终处于纵向模式(禁用横向模式).相机预览总是旋转90度ccw我无法改变它(无论是setDisplayOrientation也不是p.set("orientation", "portrait" )和p.set("rotation", 90) ).
预览总是像这样旋转还是依赖于设备?如果在纵向模式下总是如此,我可以随后旋转图像.
或者有没有办法正确设置相机?我已经阅读了很多有关此问题的帖子,但没有回答对我有用(Galaxy s2,Android v2.3)
我试图让相机预览在纵向模式下正常工作,其中活动本身可以正常改变方向(即,不被锁定到风景).
但是,使用setDisplayOrientation()严重打破了预览的行为.
这可以通过谷歌自己的ApiDemos来证明.第一个图像基于示例项目CameraPreview的android-17版本ApiDemos,其中我做的唯一更改是android:orientation="landscape"从清单中的此活动的条目中删除.下图是运行Android 4.2的Nexus 4显示屏上显示的内容的屏幕截图,相机指向一张8.5平方英寸的纸张:

该预览中不明显的是它旋转了90度.您在图像最右侧看到的袜子包裹的脚实际上位于正方形下方.
对此,至少对于横向模式,解决方案是使用setDisplayOrientation().但是,如果修改了Preview内部类的CameraPreview有mCamera.setDisplayOrientation(90);,你会得到这样的:

值得注意的是,广场不再是正方形.
它使用与SurfaceView以前相同的大小.我已经使用其他一些代码重现了这个场景ApiDemos,并且我TextureView在该代码中得到了相同的行为.
我简单地想到问题可能是getSupportedPreviewSizes()基于可能会返回不同的值setDisplayOrientation(),但快速测试表明情况并非如此.
任何人都知道如何setDisplayOrientation()在纵向模式下工作而不会破坏图像的宽高比推到预览中?
谢谢!
我正在为Android API 16到21开发相机应用程序,其主要目的是拍摄肖像照片.我可以用几个设备(Nexus 4,Nexus 5,HTC ......)拍照并正确定位(意味着我的预览等于拍摄的照片尺寸和方向).
但是我已经在其他几个设备上测试了我的应用程序,其中一些设备给我带来了很多麻烦:三星Galaxy S3/S4/S5.
在这三个设备上,预览正确显示,但方法返回的图片onPictureTaken(final byte[] jpeg, Camera camera)始终是侧面的.
这是byte[] jpeg在将ImageView保存到磁盘之前从我的用户创建并在ImageView中显示的位图:

这是保存在磁盘上的图像:

正如您所看到的,图像在预览中完全拉伸,并且一旦保存在磁盘上就会错误地旋转.
这是我的CameraPreview类(我混淆了其他方法,因为它们与相机参数无关):
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback
{
private SurfaceHolder surfaceHolder;
private Camera camera;
// Removed unnecessary code
public void surfaceCreated(SurfaceHolder holder)
{
camera.setPreviewDisplay(holder);
setCameraParameters();
camera.startPreview();
}
private void setCameraParameters()
{
Camera.Parameters parameters = camera.getParameters();
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(Camera.CameraInfo.CAMERA_FACING_BACK, info);
DisplayMetrics metrics = new DisplayMetrics();
WindowManager windowManager = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(metrics);
int rotation = windowManager.getDefaultDisplay().getRotation(); …Run Code Online (Sandbox Code Playgroud) 我有一个摩托罗拉Defy OS Android 2.1,我用相机预览版制作了一个应用程序.问题是相机在搭载Android 2.1的三星Galaxy S上工作正常,但在摩托罗拉上,相机旋转90度.我试过这样做:
Parameters parameters = camera.getParameters();
parameters.setRotation(90);
Run Code Online (Sandbox Code Playgroud)
但它不起作用.我还没有找到任何解决方案.
android ×8
orientation ×4
camera ×3
portrait ×2
preview ×1
rotation ×1
smartphone ×1
surfaceview ×1
zxing ×1