【问题标题】:Message while starting Camera preview on SurfaceView on Android在 Android 上的 SurfaceView 上启动相机预览时出现消息
【发布时间】:2011-12-07 18:24:40
【问题描述】:

让我先从编码开始。 我的 xml 文件(其中的相关部分)包含以下内容:

<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:background="#ffffff">


        <SurfaceView
            android:id="@+id/cameraView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:visibility="gone" />

        <LinearLayout
            android:id="@+id/layStatus"
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:visibility="gone">

            <TextView
                android:id="@+id/txtStatus"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:background="#90000000"
                android:paddingBottom="5dip"
                android:paddingTop="5dip"
                android:gravity="center_vertical|center_horizontal"
                android:textSize="20dip" />
        </LinearLayout>
</FrameLayout>

如您所见,我已经完成了一个基本设置,一个包含表面视图(可见性设置为消失)的框架布局和另一个带有简单 TextView 的布局。 以下是我的活动:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mylayout);

        cameraView = (SurfaceView)findViewById(R.id.cameraView);

        surfaceHolder = cameraView.getHolder();
        surfaceHolder.addCallback(CompassActivity.this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public void btnCameraOnClick(View target) {

    cameraView.setVisibility(View.VISIBLE);

    }

在 Surface changed 中启动相机预览,当表面可见性改变时触发。

@Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            txtStatus.setVisibility(View.Visible);
            txtStatus.setText("Starting camera");
camera = Camera.open();
if (camera != null){
                try {

                    camera.setDisplayOrientation(90);
                    Camera.Parameters parameters = camera.getParameters();

                    List<Size> sizes = parameters.getSupportedPreviewSizes();
                    Size size = sizes.get(0);
                    parameters.setPreviewSize(size.width, size.height);

                    camera.setParameters(parameters);

                    camera.setPreviewDisplay(holder);
                    camera.startPreview();

                     txtStatis.setVisibility(View.GONE);
                } catch (IOException e) {
                }
            }
}

那么问题是什么?我想在相机预览开始时简单地显示一个文本。为此,我使 txtStatus 可见并为其设置文本。当预览开始时,我只是隐藏它。好吧,它不是这样工作的,当我按下按钮开始相机预览时,UI 线程冻结等待预览并且我的状态消息不显示。我该如何解决? HERE 有一个解决方案,但我想也许有一个更简单的解决方案。

感谢您的宝贵时间。

【问题讨论】:

    标签: android surfaceview android-camera


    【解决方案1】:

    相机启动需要一些时间 - 应启动外部进程并设置好一切。我推测,表面更改的回调是直接从 setVisibility() 执行并阻塞 UI 线程。解决方案非常简单 - 只需生成新线程并在那里进行相机初始化。

    在我的 OCR 应用程序中,我在 onResume() 中启动相机 - 因为我总是需要工作预览

    您可能会发现我的 OCR android 演示很有帮助:

    http://sourceforge.net/projects/javaocr/

    (相机预览,带叠加层)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多