安卓竖屏锁定相机预览

3
我已经按照Android ApiDemos应用程序中的实现方式来实现Camera预览。问题在于,我想让我的活动(其中包含预览)锁定为纵向。因此,我在清单文件中将screenOrientation设置为“portrait”。
“getOptimalPreviewSize”方法返回相反的预览值,这意味着当需要返回480x720时,该方法返回720x480,而在我的Activity的FrameLayout中,我有一个小预览居中显示(这不是我想要的,我希望它与父级匹配(是的,布局使用“match_parent”定义)。
我尝试过:
setDisplayOrientation(90); parameters.set("orientation", "portrait"); parameters.set("rotation", "90");
似乎没有任何帮助。
为什么我不能以纵向模式显示摄像头预览?已锁定。
谢谢

1
这是一个类似于您需求的链接:https://dev59.com/2Wgv5IYBdhLWcg3wW_h_。请阅读已接受答案的注意事项。 - Raghunandan
2个回答

2
这是一个在SurfaceView上实现的相机竖屏预览的工作示例:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surface);
    surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {

        private Camera camera;

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                camera = Camera.open();
                camera.setPreviewDisplay(holder);
                camera.setDisplayOrientation(90);
                camera.startPreview();
            } catch (IOException e) {
                Log.e(TAG, "Error", e);
            }
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) { 
            camera.stopPreview();
        }

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

使用以下布局文件:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <SurfaceView
        android:id="@+id/surface"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

当设置contentView时,这样做很好,但如果您想从XML设置它呢?我认为布局的宽度和高度会再次出现问题 :/ - user584513
你能否检查一下这个是否可行:使用自定义视图(扩展ViewGroup,就像示例中一样),而不是SurfaceView,并实现SurfaceHolder.Callback来锁定屏幕方向,方法是setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT)?谢谢! - user584513
哪些样本?在官方指南中,他们使用SurfaceView:http://developer.android.com/training/camera/cameradirect.html#camera-preview - sdabet
我的意思是,除了使用SurfaceView之外,你如何获得SurfaceHolder? - sdabet
问题是,当我使用这个例子:http://is.gd/vyx9Rt 并将Activity锁定为纵向时,我得到了错误的预览大小(在Activity中心对齐,尺寸较小)。当我使用你的例子时,一切都好了...我只需要更复杂的东西... - user584513

-1

尝试使用 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);

这将锁定活动在该方向上。

以下代码来自Google文档:

public static void setCameraDisplayOrientation(Activity activity,
     int cameraId, android.hardware.Camera camera) {
 android.hardware.Camera.CameraInfo info =
         new android.hardware.Camera.CameraInfo();
 android.hardware.Camera.getCameraInfo(cameraId, info);
 int rotation = activity.getWindowManager().getDefaultDisplay()
         .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;
 }
 camera.setDisplayOrientation(result);
}

这将正确设置相机和预览的方向。


setRequestedOrientation和在Android清单文件中设置screenOrientation不是一样的吗?如果是,我已经将其设置为PORTRAIT了。 - user584513
请注意,这不是问题的答案。 - swiftBoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接