在Android上启动SurfaceView相机预览时的消息

在Android上启动SurfaceView相机预览时的消息,android,surfaceview,android-camera,Android,Surfaceview,Android Camera,让我先从编码开始。 我的xml文件(相关部分)包含以下内容: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" an

让我先从编码开始。 我的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>
在“曲面已更改”中启动摄影机预览,当曲面的可见性更改时将触发该选项

@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.setVisibility(View.Visible);
setText(“启动照相机”);
camera=camera.open();
如果(照相机!=null){
试一试{
摄像头。设置显示方向(90);
Camera.Parameters=Camera.getParameters();
列表大小=参数。getSupportedPreviewSizes();
大小=大小。获取(0);
parameters.setPreviewSize(size.width、size.height);
设置参数(参数);
摄像头。设置预览显示(支架);
camera.startPreview();
txtStatis.setVisibility(View.GONE);
}捕获(IOE异常){
}
}
}
那有什么问题?我只想在相机预览开始时显示文本。为此,我将txtStatus设置为可见并设置一个文本。当预览开始时,我只是将其隐藏。嗯,它不是这样工作的,当我按下按钮开始相机预览时,UI线程冻结等待预览,并且我的状态消息不显示。我怎样才能修好它?现在有一个解决办法,但我想也许有一个更简单的办法


谢谢您的时间。

摄像机启动需要一些时间-外部过程将启动,一切都将设置好。我推测,surface changed回调直接从setVisibility()执行,并阻塞UI线程。解决方案非常简单-只需生成新线程并在那里执行camera init

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

您可能会发现我的OCR android演示非常有用:

(摄影机预览,带覆盖)

@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) {
                }
            }
}