【问题标题】:surfaceCreated() Never CalledsurfaceCreated() 从未调用
【发布时间】:2011-10-15 04:57:00
【问题描述】:

我遇到了与我遇到的问题类似的问题,但我仍然找不到解决方案。我对 Android 开发非常陌生,所以我无法追踪我的问题。无论如何,我正在尝试使用我创建的扩展 SurfaceView 并实现 SurfaceHolder.Callback 的 CameraSurfaceView 类来创建相机预览。无论我在 StartCamera 类中尝试什么,都不会调用 surfaceCreated() 方法,因此我的相机永远不会启动。任何帮助都会很棒,谢谢!

StartCamera.java

import net.peterd.zombierun.R;
import android.hardware.Camera;
import android.os.Bundle;
import android.widget.FrameLayout;

public class StartCamera extends BaseActivity {

    private Camera mCamera;
    private CameraSurfaceView mView;

    public void onCreate(Bundle state) {
        // TODO Auto-generated constructor stub
        super.onCreate(state);
        setContentView(R.layout.start_camera);
    }

    public void onResume() {
        super.onResume();

        mView = new CameraSurfaceView(this);
        FrameLayout preview = (FrameLayout) findViewById(R.id.cPreview);
        preview.addView(mView);
    }

    public void onPause() {
        mCamera.stopPreview();
        mCamera.release();
    }

}

CameraSurfaceView.java

import java.io.IOException;
import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback
{
        private SurfaceHolder holder;
        private Camera camera;

        public CameraSurfaceView(Context context) 
        {
                super(context);

                //Initiate the Surface Holder properly
                this.holder = this.getHolder();
                this.holder.addCallback(this);
                this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) 
        {
                try
                {
                        //Open the Camera in preview mode
                        this.camera = Camera.open();
                        this.camera.setPreviewDisplay(this.holder);
                }
                catch(IOException ioe)
                {
                        ioe.printStackTrace(System.out);
                }
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
        {
                // Now that the size is known, set up the camera parameters and begin
                // the preview.
                Camera.Parameters parameters = camera.getParameters();
                parameters.setPreviewSize(width, height);
                camera.setParameters(parameters);
                camera.startPreview();
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) 
        {
                // Surface will be destroyed when replaced with a new screen
                //Always make sure to release the Camera instance
                camera.stopPreview();
                camera.release();
                camera = null;
        }

        public Camera getCamera() {
            return camera;
        }
}

start_camera.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <FrameLayout android:id="@+id/cPreview"
        android:layout_weight="1" android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    </FrameLayout>

</LinearLayout>

【问题讨论】:

    标签: android camera surfaceview preview


    【解决方案1】:

    显然这是因为 FrameLayout 是空的,因此没有创建任何类型的 SurfaceView。您可以尝试手动强制父 LinearLayout 设置高度和宽度,或者只是在 FrameLayout 内添加一个 imageView。由于 FrameLayout 可能包含许多小部件,但它只显示最后一个小部件,您可以在 FrameLayout 中放置一个 ImageView,显示一个仅用于创建 SurfaceView 的小图像。

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    
    <FrameLayout android:id="@+id/cPreview"
        android:layout_weight="1" android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    
    <!-- Adding small dummy image -->
    <ImageView android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        src="@drawable/small_picture">
    
    </FrameLayout>
    
    </LinearLayout>
    

    【讨论】:

      【解决方案2】:

      我在CameraSurfaceView 方法surfaceChanged 中的这一行出现错误:

      camera.setParameters(parameters);
      

      一旦我将其注释掉,它就可以正常工作。

      【讨论】:

        【解决方案3】:

        @jvnane 我试过你的代码,它可以工作,有小错误。

        surfaceChanged 被调用没有问题。你认为它在什么方面不起作用?尝试添加调试消息并在 LogCat 中查看:

        @Override
        public void surfaceCreated(final SurfaceHolder holder)
        {
            Log.i("Camera Test", "It works!");
            try
            {
                //Open the Camera in preview mode
                this.camera = Camera.open();
                this.camera.setPreviewDisplay(this.holder);
            }
            catch(final IOException ioe)
            {
                ioe.printStackTrace(System.out);
            }
        }
        

        小错误:Camera 对象在surfaceDestroyed 中释放,因此您无需在活动的onPause 中再次释放它。另外,覆盖onPause()方法时需要调用super.onPause()

        【讨论】:

          【解决方案4】:

          我也遇到了同样的问题。对我来说,这是因为视图大小被设置为 0,因此从未创建表面。我通过设置特定大小来检查这一点,突然间调用了回调。 (显然,如果 View 布局在屏幕外,同样适用)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-28
            • 1970-01-01
            • 2023-03-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多