pb77
pb77

Reputation: 47

Android Camera Saving Internally

My problem is the following one, I need to save a picture of my camera application into the gallery so far couldnt achieve it, any guess where is wrong? Only posting the most importants parts... Help me, please!

When the take picture button is pressed

public class CameraActivity extends Activity {      
private Camera mCamera;     
private CameraPreview mPreview;    
private String TAG = "CameraActivity";
public static final int MEDIA_TYPE_IMAGE = 1;

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

    // Create an instance of Camera  
    mCamera = getCameraInstance();          

    // Create our Preview view and set it as the content of our activity.         
    mPreview = new CameraPreview(this, mCamera);         
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);         
    preview.addView(mPreview);     

    Button clickButton = (Button) findViewById(R.id.button_capture);
    clickButton.setOnClickListener(new OnClickListener() {
         @Override
         public void onClick(View v) {
             // TODO Auto-generated method stub

             mCamera.startPreview();
             //mCamera.setPreviewCallback(null);
             mCamera.takePicture(null, null, mPicture);
         }
    });
}

private PictureCallback mPicture = new PictureCallback() {

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);

        try {
            FileOutputStream fos = new FileOutputStream(pictureFile);
            fos.write(data);
            fos.close();
        } catch (FileNotFoundException e) {
            //Log.d(TAG, "File not found: " + e.getMessage());
        } catch (IOException e) {
            //Log.d(TAG, "Error accessing file: " + e.getMessage());
        }
    }
};

public static Camera getCameraInstance() {
    Camera c = null;     
    try {         
        c = Camera.open(); // attempt to get a Camera instance     
    }     
    catch (Exception e){         
        // Camera is not available (in use or does not exist)     
    }     return c; // returns null if camera is unavailable }
}


private static File getOutputMediaFile(int type){
    File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile = new File(dir.getPath() + File.separator + "IMG_"+ timeStamp + ".jpg");
    return mediaFile;
}

}

Finding the path to save internally

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {      
private SurfaceHolder mHolder;     
private Camera mCamera;     

public CameraPreview(Context context, Camera camera) {         
    super(context);         
    mCamera = camera;          

    // Install a SurfaceHolder.Callback so we get notified when the         
    // underlying surface is created and destroyed.         
    mHolder = getHolder();         
    mHolder.addCallback(this);         
    // deprecated setting, but required on Android versions prior to 3.0         
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);     
}      

public void surfaceCreated(SurfaceHolder holder) {         
    // The Surface has been created, now tell the camera where to draw the preview.         
    try {             
        mCamera.setPreviewDisplay(holder);             
        mCamera.startPreview();         
    } catch (IOException e) {             
        Log.d(VIEW_LOG_TAG, "Error setting camera preview: " + e.getMessage());         
    }     
}      

public void surfaceDestroyed(SurfaceHolder holder) {   
    mCamera.release();
    // empty. Take care of releasing the Camera preview in your activity.     
}      
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {         
    // If your preview can change or rotate, take care of those events here.         
    // Make sure to stop the preview before resizing or reformatting it.          
    if (mHolder.getSurface() == null){           
        // preview surface does not exist           
        return;         
    }          

    // stop preview before making changes         
    try {             
        //mCamera.stopPreview();         
    } catch (Exception e){           
        // ignore: tried to stop a non-existent preview         
    }          
    // set preview size and make any resize, rotate or      
    // reformatting changes here          

    // start preview with new settings         
    try {             
        mCamera.setPreviewDisplay(mHolder);             
        mCamera.startPreview();      
    } catch (Exception e){             
        Log.d(VIEW_LOG_TAG, "Error starting camera preview: " + e.getMessage());         
    }  
}   

}

}

Upvotes: 0

Views: 176

Answers (1)

SoulRayder
SoulRayder

Reputation: 5166

Write

mCamera.StartPreview();

before the

 mCamera.takePicture(null, null, mPicture);

EDIT: Also, instead of

 mCamera.takePicture(null, null, mPicture);

use

 mCamera.takePicture(null, null, null, mPicture);

If that does not work, try calling with

 mCamera.takePicture(null, null, null, new PictureCallBack());

Upvotes: 1

Related Questions