Custom Camera App with Filters
Posted By : Deepanshu Harbola | 30-Jun-2016
Android provides its own native camera features and as well as the camera interface for making a custom camera app as per developers need.
Here we are going to learn how to create a custom camera app and all about it-
There are some general steps for creating a custom camera app-
- Detect and Access Camera.
- Create a Preview Class.
- Build Preview Layout.
- Setup Listener for Capture.
- Capture and Save File.
- Release the Camera.
For more information please visit the official android docs- https://developer.android.com/guide/topics/media/camera.html
Let's see the code example to create the custom camera app step-by-step -
1- Create Camera Preview Class- CameraPreview.java
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mHolder; private Camera mCamera; public final String TAG = "CameraPreview"; 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.setDisplayOrientation(90); mCamera.getParameters(); mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (IOException e) { Log.d(TAG, "Error setting camera preview: " + e.getMessage()); } } public void surfaceDestroyed(SurfaceHolder holder) { // 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(TAG, "Error starting camera preview: " + e.getMessage()); } } }
2- Layout for Preview- activity_cam.xml
3- Give permissions on manifest file-
4- Capture and Save image- CameraActivity.java
public class CamActivity extends AppCompatActivity implements View.OnClickListener { private Camera mCamera; public static final String TAG = "CamActivity"; private boolean isFilterOpen=false; private ImageView filterButton; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_cam); // Create an instance of Camera mCamera = getCameraInstance(); // Create our Preview view and set it as the content of our activity. CameraPreview mPreview = new CameraPreview(this, mCamera); FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); if (preview != null) { preview.addView(mPreview); } // Add a listener to the Capture button ImageView captureButton = (ImageView) findViewById(R.id.button_capture); if (captureButton != null) { captureButton.setOnClickListener(this); } // Add listener to filter button filterButton = (ImageView) findViewById(R.id.filterButton); if (filterButton != null) { filterButton.setOnClickListener(this); } } /** A safe way to get an instance of the Camera object. */ 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 } // Method for set the camera filters public void colorEffectFilter(View v){ try { Camera.Parameters parameters = mCamera.getParameters(); switch (v.getId()) { case R.id.effectNone: parameters.setColorEffect(Camera.Parameters.EFFECT_NONE); mCamera.setParameters(parameters); break; case R.id.effectAqua: parameters.setColorEffect(Camera.Parameters.EFFECT_AQUA); mCamera.setParameters(parameters); break; case R.id.effectBlackboard: parameters.setColorEffect(Camera.Parameters.EFFECT_BLACKBOARD); mCamera.setParameters(parameters); break; case R.id.effectMono: parameters.setColorEffect(Camera.Parameters.EFFECT_MONO); mCamera.setParameters(parameters); break; case R.id.effectNegative: parameters.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE); mCamera.setParameters(parameters); break; case R.id.effectPosterize: parameters.setColorEffect(Camera.Parameters.EFFECT_POSTERIZE); mCamera.setParameters(parameters); break; case R.id.effectSepia: parameters.setColorEffect(Camera.Parameters.EFFECT_SEPIA); mCamera.setParameters(parameters); break; case R.id.effectSolarize: parameters.setColorEffect(Camera.Parameters.EFFECT_SOLARIZE); mCamera.setParameters(parameters); break; case R.id.effectWhiteboard: parameters.setColorEffect(Camera.Parameters.EFFECT_WHITEBOARD); mCamera.setParameters(parameters); break; } }catch (Exception ex){ Log.d(TAG,ex.getMessage()); } } private Camera.PictureCallback mPicture = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { File pictureFile = getOutputMediaFile(); if (pictureFile == null){ Log.d(TAG, "Error creating media file, check storage permissions: "); return; } MediaScannerConnection.scanFile(CamActivity.this, new String[] { pictureFile.toString() }, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(String path, Uri uri) { Log.i("ExternalStorage", "Scanned " + path + ":"); Log.i("ExternalStorage", "-> uri=" + uri); } }); 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()); } } }; /** File for saving an image */ private static File getOutputMediaFile(){ File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "CamPictures"); // Create the storage directory if it does not exist if (! mediaStorageDir.exists()){ if (! mediaStorageDir.mkdirs()){ Log.d(TAG, "failed to create directory"); return null; } } // Create a media file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); return new File(mediaStorageDir.getAbsolutePath() + File.separator + "IMG_"+ timeStamp + ".jpg"); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.filterButton: if (!isFilterOpen){ findViewById(R.id.record_filter_layout).setVisibility(View.VISIBLE); filterButton.setImageResource(R.drawable.filter_on); isFilterOpen=true; } else { findViewById(R.id.record_filter_layout).setVisibility(View.GONE); filterButton.setImageResource(R.drawable.filter_off); isFilterOpen=false; } break; case R.id.button_capture: mCamera.takePicture(null,null,mPicture); break; } } @Override protected void onPause() { super.onPause(); mCamera.stopPreview(); mCamera.release(); } @Override protected void onDestroy() { super.onDestroy(); mCamera.stopPreview(); mCamera.release(); mCamera = null; } }
Download the complete project from here.
THANKS
Cookies are important to the proper functioning of a site. To improve your experience, we use cookies to remember log-in details and provide secure log-in, collect statistics to optimize site functionality, and deliver content tailored to your interests. Click Agree and Proceed to accept cookies and go directly to the site or click on View Cookie Settings to see detailed descriptions of the types of cookies and choose whether to accept certain cookies while on the site.
About Author
Deepanshu Harbola
Deepanshu is an Android application developer with experience in Titanium Framework . Deepanshu likes to play basketball ,volleyball and listens to music in his free time.