1

我创建了一个具有 SurfaceView 和 SurfaceHolder 的 Activity 以创建相机叠加层。出于某种原因,我在 ADB 中得到以下信息:04-08 10:54:06.747: E/Camera(1152): Error 1。我可以拍照,但无法进行任何预览。这是我正在使用的代码:

public class MyActivity extends Activity implements
    SurfaceHolder.Callback, Camera.ShutterCallback, Camera.PictureCallback, OnClickListener {
private Camera mCamera;
private SurfaceView videoPreview;
private SurfaceHolder surfaceHolder;
private Button cancel;
private Button takePicture;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    setContentView(R.layout.camera_layout);
    videoPreview = (SurfaceView) findViewById(R.id.video_preview);
    cancel = (Button) findViewById(R.id.cancel);
    cancel.setOnClickListener(this);
    takePicture = (Button) findViewById(R.id.take_picture);
    takePicture.setOnClickListener(this);
    surfaceHolder = videoPreview.getHolder();
    surfaceHolder.addCallback(this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    // Camera.open(getNumberOfCameras() - 1); => access front facing camera as well
    mCamera = Camera.open(); 
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    Camera.Parameters parameters = mCamera.getParameters();
    // pick the device's largest supported camera size
    List<Camera.Size> cameraSizes = parameters.getSupportedPreviewSizes();

    // the first size is the largest
    Camera.Size selectedSize = cameraSizes.get(0);

    parameters.setPreviewSize(selectedSize.width, selectedSize.height);

    mCamera.setDisplayOrientation(90);
    mCamera.setParameters(parameters);

    mCamera.startPreview();
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    try {
        mCamera.setPreviewDisplay(surfaceHolder);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}

@Override
protected void onPause() {
    super.onPause();
    mCamera.stopPreview();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mCamera.release();
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.cancel:
        finish();
        break;
    case R.id.take_picture:
        mCamera.takePicture(this, null, null, this);
        break;
    }
}

@Override
public void onPictureTaken(byte[] data, Camera camera) {
    // store the picture 
    FileOutputStream fos = null;
    File imageFile = null;
    try {
        imageFile = new File(Environment.getExternalStorageDirectory(), "custom_image1.png");
        fos = new FileOutputStream(imageFile);
        fos.write(data);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (fos != null) {
            try {
                fos.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    mCamera.startPreview();
}

@Override
public void onShutter() {
    // perform an animation
}

}

这是布局:

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

<SurfaceView
    android:layout_weight="1"
    android:id="@+id/video_preview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<Button
    android:id="@+id/cancel"
    android:layout_width="100dip"
    android:layout_height="wrap_content"
    android:text="Cancel" /> 

<Button
    android:id="@+id/take_picture"
    android:layout_width="100dip"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:text="Snap Photo" />

</LinearLayout>

我尝试将其更改为 RelativeLayout 但无济于事。我真的认为我错过了一些简单的事情。任何帮助是极大的赞赏。谢谢!

4

1 回答 1

0

您没有 onResume() 方法可以再次调用 startPreview(),因此当您拍照时,预览未运行,因此捕获失败。

要对此进行测试,请尝试在捕获图像之前添加 camera.startPreview() 并查看是否有效。

于 2013-01-01T19:32:56.680 回答