【问题标题】:Android: Take photo without preview: java.lang.RuntimeException: takePicture failedAndroid:在没有预览的情况下拍照:java.lang.RuntimeException:takePicture failed
【发布时间】:2014-09-30 11:23:14
【问题描述】:

我得到一个 java.lang.RuntimeException: takePicture failed for the following Android code:

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) {
        //...
    }
};

}

我只是想用前置摄像头拍一张没有预览的照片,然后保存。

使用以下代码在 Main Activity 中创建此类的一个实例:

TakePicture tp = new TakePicture(this);

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

提前致谢!

【问题讨论】:

    标签: java android camera


    【解决方案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;
        }
    }
    

    【讨论】:

    • 非常感谢,这有效!奇怪的是,我保存到 DCIM 的图片方向是错误的。你有什么额外的提示吗?
    猜你喜欢
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    相关资源
    最近更新 更多