Android:无预览拍照:java.lang.RuntimeException:takePicture失败

时间:2014-09-30 11:23:14

标签: java android camera

我收到java.lang.RuntimeException:以下Android代码的takePicture失败:

public class TakePicture {
Camera camera;
Parameters parameters;
Context context;
public TakePicture(Context context)
{
    camera = Camera.open();
    this.context=context;
    parameters = camera.getParameters();
    parameters.setPictureFormat(PixelFormat.JPEG);
    camera.setParameters(parameters);

    SurfaceView sview = new SurfaceView(context);
    try {
        camera.setPreviewDisplay(sview.getHolder());
        camera.startPreview();
        camera.takePicture(null,null,photoCallback);
    } catch (IOException e) {
        e.printStackTrace();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }


}

PictureCallback photoCallback=new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
        //...
    }
};

}

我只想在没有预览的情况下使用前置摄像头拍照,然后将其保存。

使用以下代码在主活动中创建此类的实例:

TakePicture tp = new TakePicture(this);

您对如何解决这个问题有什么建议吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

试试这段代码。

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //get the Image View at the main.xml file
        iv_image = (ImageView) findViewById(R.id.imageView);

        //get the Surface View at the main.xml file
        sv = (SurfaceView) findViewById(R.id.surfaceView);

        //Get a surface
        sHolder = sv.getHolder();

        //add the callback interface methods defined below as the Surface View callbacks
        sHolder.addCallback(this);

        //tells Android that this surface will have its data constantly replaced
        sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3)
    {
         //get camera parameters
         parameters = mCamera.getParameters();

         //set camera parameters
         mCamera.setParameters(parameters);
         mCamera.startPreview();

         //sets what code should be executed after the picture is taken
         Camera.PictureCallback mCall = new Camera.PictureCallback()
         {
             @Override
             public void onPictureTaken(byte[] data, Camera camera)
             {
                 //decode the data obtained by the camera into a Bitmap
                 bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
                 //set the iv_image
                 iv_image.setImageBitmap(bmp);
             }
         };

         mCamera.takePicture(null, null, mCall);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder)
    {
        // The Surface has been created, acquire the camera and tell it where
        // to draw the preview.
        mCamera = Camera.open();
        try {
           mCamera.setPreviewDisplay(holder);

        } catch (IOException exception) {
            mCamera.release();
            mCamera = null;
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder)
    {
        //stop the preview
        mCamera.stopPreview();
        //release the camera
        mCamera.release();
        //unbind the camera from this object
        mCamera = null;
    }
}