0

I'm a beginner in Android programmation and I'd like to take a picture with the front cam while displaying a blue screen. So that the blue screen acts like a blue filter on the picture.

I've followed this tuto : link

But I'm having a NullPointer for this : mCamera.setPreviewDisplay(holder);Altough I declare the camera and get the Holder from the surfaceView exactly like in the tuto.

Any idea ?

Here is my code :

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 Answers1

2

mCamera seems to be null after this line:

mCamera = Camera.open();

According to Android Camera Reference:

If the device does not have a back-facing camera, this returns null.

In case you don't have a back camera you need to see the id of any cameras that are available.

Call Camera.getNumberOfCameras() and then pass a valid camera id into Camera.open(id)

To find more information about a specific camera, call Camera.getCameraInfo() where you can check the fields to determine what kind of camera it is

Sujen
  • 1,614
  • 5
  • 19
  • 25
  • Wow thanks, I've add `mCamera = Camera.open(CameraInfo.CAMERA_FACING_FRONT); ` and now when I run the app, a picture is taken and previewed in the top half part of the screen but it is not saved in the phone... Do you know why ? – user3336797 Mar 04 '14 at 19:34
  • On the `onPictureTaken()` you need to save the image. Right now you only set the image on an ImageView. See http://developer.android.com/training/camera/photobasics.html#TaskPath – Sujen Mar 04 '14 at 19:49
  • Oh yes right, I'll try that ! And do you think it is possible to display a totally blue picture while taking the picture ? It has to be like a filter on the photo -> The object will be blue colored – user3336797 Mar 04 '14 at 19:57
  • I think so but it sounds difficult. See http://stackoverflow.com/questions/8371055/apply-custom-filters-to-camera-output – Sujen Mar 04 '14 at 20:08
  • 1
    `Camera.open(CameraInfo.CAMERA_FACING_FRONT)` is a common mistake. open() takes camera index (0 or 1 when device has two cameras, or 0 if there is only one, be it only front as on Nexus 7, or only back as on Motorola Defy), while CameraInfo constants have universal meaning. – Alex Cohn Mar 04 '14 at 20:21
  • Humm ok so what should I put ? This is working on my galaxy S4 – user3336797 Mar 04 '14 at 21:02
  • @Sujen In fact I just want the screen to be blue when I take the pic, I don't want to apply a filter programmaticaly... So the blue screen has to appear before the photo is taken. I tried by setting a blue picture in android:background in the manifest but it still appear after the photo is taken so my photo is not blue colored.. – user3336797 Mar 04 '14 at 22:48
  • I'm trying with : `iv_image = (ImageView) findViewById(R.id.imageView); iv_image.setBackgroundColor(Color.BLUE); ` at the beginning of my OnCreate function but it still appears after the photo is taken and I don't know why – user3336797 Mar 04 '14 at 23:19
  • I suggest that you open a new question about _blue_ screen. – Alex Cohn Mar 05 '14 at 03:10