当前位置: 代码迷 >> Android >> 怎么动态创建一个SurfaceView来预览相机
  详细解决方案

怎么动态创建一个SurfaceView来预览相机

热度:18   发布时间:2016-04-27 23:02:13.0
如何动态创建一个SurfaceView来预览相机
如何动态创建一个SurfaceView来预览相机
我使用new SurfaceView对象来预览相机,但是提示错误Camera﹕ app passed NULL surface。
这是为什么呢?

测试代码如下:
xml布局文件 :

    <LinearLayout android:id="@+id/LinearLayout01" android:layout_width="wrap_content" android:layout_height="wrap_content">
        <Button android:id="@+id/Button04" android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:text="测试" android:onClick="btnDrawOnClieck3"></Button>
    </LinearLayout>

    <LinearLayout android:id="@+id/LinearLayout02" android:layout_width="fill_parent" android:layout_height="fill_parent">
    </LinearLayout>


MainActivity文件

public class MainActivity extends ActionBarActivity {

    private final static String TAG_LOG="sfv2App";

    LinearLayout mLayout;
    SurfaceView sfv;
    SurfaceHolder sfh;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d(TAG_LOG, "onCreate");

        mLayout = (LinearLayout) this.findViewById(R.id.LinearLayout02);  //获取LinearLayout显示视图

    }


    public void btnDrawOnClieck3(View source) {
        setTitle("btnDrawOnClieck3");
        Camera camera = null;
        sfv = new SurfaceView(this);
        mLayout.addView(sfv);          //添加到一个容器里面显示

        sfh = sfv.getHolder();
        // 此处默认打开后置摄像头, 通过传入参数可以打开前置摄像头
        camera = Camera.open(0);   //①
        camera.setDisplayOrientation(90);  //设置预览方向,

        if (camera != null )
        {
            try
            {
                Camera.Parameters parameters = camera.getParameters(); //获取摄像头参数
                // 设置预览照片的大小
                parameters.setPreviewSize(200, 200);
                // 设置预览照片时每秒显示多少帧的最小值和最大值
                parameters.setPreviewFpsRange(4, 10);
                // 设置图片格式
                parameters.setPictureFormat(ImageFormat.JPEG);
                // 设置JPG照片的质量
                parameters.set("jpeg-quality", 85);
                // 设置照片的大小
                parameters.setPictureSize(200, 200);
                // 通过SurfaceView显示取景画面
                camera.setPreviewDisplay(sfh);
                // 开始预览
                camera.startPreview();
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

   /*...其他省略....*/
}


------解决思路----------------------
你加holderCallback试试 当执行onSurfaceCreated的时候 再执行camera.setPreviewDisplay(sfh);