setPreviewDisplay(holder)上的NullPointer

时间:2014-03-04 17:34:03

标签: android camera

我是Android编程的初学者,我想在显示蓝屏的同时用前置摄像头拍照。因此蓝屏在图片上就像一个蓝色滤镜。

我已经关注了这个tuto:link

但是我有一个NullPointer:mCamera.setPreviewDisplay(holder);尽管我声明了相机,并从surfaceView获取Holder,就像在tuto中一样。

有什么想法吗?

这是我的代码:

public class TakePicture extends Activity implements SurfaceHolder.Callback
{

private ImageView iv_image;
//a variable to store a reference to the Surface View at the main.xml file
private SurfaceView sv;

//a bitmap to display the captured image
private Bitmap bmp;

//Camera variables
//a surface holder
private SurfaceHolder sHolder;  
//a variable to control the camera
private Camera mCamera;
//the camera parameters
private Parameters parameters;


/** Called when the activity is first created. */
@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);

    //surfaceCreated(sHolder);
    //surfaceChanged(sHolder, 1, 1, 1);
    //surfaceDestroyed(sHolder);


}

@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 = openFrontFacingCameraGingerbread();
    //Log.e("COUCOU", "bonjour");

    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;
}  
}

1 个答案:

答案 0 :(得分:2)

此行之后

mCamera似乎是null

mCamera = Camera.open();

根据Android Camera Reference

  

如果设备没有后置摄像头,则返回null。

如果您没有后置摄像头,则需要查看任何可用摄像头的ID。

致电Camera.getNumberOfCameras(),然后将有效的相机ID传递到Camera.open(id)

要查找有关特定相机的更多信息, 拨打Camera.getCameraInfo(),您可以在其中检查字段以确定它是什么类型的相机