“Error 1” occurring during camera overlay in Android

▼魔方 西西 提交于 2019-12-12 05:16:14

问题


I have created an Activity that has a SurfaceView and a SurfaceHolder in order to create a Camera overlay. For some reason, I am getting the following in ADB: 04-08 10:54:06.747: E/Camera(1152): Error 1. I am able to take a picture, but I cannot get any kind of preview. Here is the code I am using:

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
}

}

And here is the layout:

<?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>

I have tried changing this to RelativeLayout but to no avail. I really think I have just missed something simple. Any help is greatly appreciated. Thanks!


回答1:


You have no onResume() method to call startPreview() again, hence when you take a picture, the preview is not running, so the capture fails.

To test this, try adding camera.startPreview() right before you capture an image, and see if that works.



来源:https://stackoverflow.com/questions/10065563/error-1-occurring-during-camera-overlay-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!