2014-09-30 113 views
3

我得到了java.lang.RuntimeException:takePicture失敗以下的Android代碼:安卓拍照預覽無:了java.lang.RuntimeException: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

試試這個代碼。

@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; 
    } 
} 
+0

非常感謝,這是工作!奇怪的是,我保存到DCIM的圖片的方向是錯誤的。你有什麼額外的提示嗎? – resound88 2014-10-02 12:01:37