- Rameshkumar Subramanian
Its always my craze
to work on the image processing application. Infact I was thinking of developing a camera application for android mobiles which i have
already done for desktop. So, let me share what?, how? did i
come up with the application through this post.
Steps to follow
- Determine camera hardware exist of not.
- Accessing the camera.
- Verifying camera features.
- Creating preview class
- Capturing the picture and save it.
- Releasing the camera.
<uses-permission
android:name="android.permission.CAMERA"/>
Note: If you are
using camera via internet, you don't need this.
<uses-feature
android:name="android.hardware.camera"/>
<uses-feature
android:name="android.hardware.camera.autofocus"/>
Before launching our
camera application in the device, check whether device is having
camera hardware or not. If not, we do not want to install our
application. In that case we can declare our manifest file as the
following below.
<uses-permission
android:name="android.permission.CAMERA"
/>
We can also detect
camera hardware in the runtime
/**
Check if this device has a camera */
private
boolean checkCameraHardware(Context context) {
if
(context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
//
this device has a camera
return
true;
}
else {
//
no camera on this device
return
false;
}
}
Camera.Open() method
to helps to access the camera.
Verifying camera
features
Once we got access
to a camera, we can get further information about its capabilities
using the Camera.getParameters()
method and checking the returned Camera.Parameters
object for supported capabilities.
Creating preview
class
The first thing
before we snap a pic is the view of it on the screen, its the
SurfacePreview class that to help view the object from camera. The
following codes implement the SufraceView class and
SurfaceHolder.Callback
function
in order to handle the destroying and the creation of views.
public
class CameraPreview extends SurfaceView implements
SurfaceHolder.Callback {
private
SurfaceHolder surfaceHolder;
private
Camera camera;
public
CameraPreview(Context context, Camera camera) {
super(context);
this.camera
= camera;
//
SurfaceHolder.Callback so we get notified when the
//
underlying surface is created and destroyed.
surfaceHolder =
getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public
void surfaceCreated(SurfaceHolder holder) {
try
{
camera.setPreviewDisplay(holder);
camera.startPreview();
}
catch (IOException e) {
Log.d(TAG, "Error
setting camera preview: " + e.getMessage());
}
}
public
void surfaceDestroyed(SurfaceHolder holder) {
//Here
we can releasing the camera preview 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
(surfaceHolder.getSurface() == null){
//
preview surface does not exist
return;
}
//
stop preview before making changes
try
{
cmera.stopPreview();
}
catch (Exception e){
}
//
set preview size and make any resize, rotate or
//
reformatting changes here
//
start preview with new settings
try
{
camera.setPreviewDisplay(mHolder);
camera.startPreview();
}
catch (Exception e){
Log.d(TAG, "Error
starting camera preview: " + e.getMessage());
}
}
}
Capturing Picture
In order to retrieve the images, use the
Camera.takePicture() method. This method has four callback function
parameters that help to handle the picture. From that parameters we must implement
the Camera.PictureCallback interface to receive the data and write it
into file.
private
PictureCallback mPicture = new PictureCallback() {
@Override
public
void onPictureTaken(byte[] data, Camera camera) {
File
pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
if
(pictureFile == null){
Log.d(TAG, "Error
creating media file, check storage permissions: " +
e.getMessage());
return;
}
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());
}
}
}
Saving Media File
In saving media
files there are two standard locations we should consider as a
developer.
- Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) This method returns the standard, shared and recommended location for saving pictures and videos. This directory is public, so other applications can easily discover, read, change and delete files saved in this location. If your application is uninstalled by the user, media files saved to this location will not be removed.
- Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES) This method returns a standard location for saving pictures and videos which are associated with your application. If your application is uninstalled, any files saved in this location are removed. Security is not enforced for files in this location and other applications may read, change and delete them.
Releasing the
Camera
Before the
application exits we have to release camera instance and also media
recorder.
@Override
protected
void onPause() {
super.onPause();
releaseMediaRecorder();
// if you are using MediaRecorder, release it first
releaseCamera();
// release the camera immediately on pause event
}
private
void releaseMediaRecorder(){
if
(mMediaRecorder != null) {
mMediaRecorder.reset();
// clear recorder configuration
mMediaRecorder.release();
// release the recorder object
mMediaRecorder =
null;
mCamera.lock();
// lock camera for later use
}
}
private
void releaseCamera(){
if
(mCamera != null){
mCamera.release();
// release the camera for other applications
mCamera
= null;
}
}
Thats how i came up with the application.