vamsiampolu

CameraPreview

Dec 25th, 2013
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.93 KB | None | 0 0
  1. package com.blutechnologies.scancard;
  2.  
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6.  
  7. import android.annotation.TargetApi;
  8. import android.app.Activity;
  9. import android.content.Context;
  10. import android.hardware.Camera;
  11. import android.hardware.Camera.Parameters;
  12. import android.hardware.Camera.Size;
  13. import android.os.Build;
  14. import android.util.Log;
  15. import android.view.Surface;
  16. import android.view.SurfaceHolder;
  17. import android.view.SurfaceView;
  18.  
  19. public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
  20.  
  21.  
  22.    
  23.     Camera mCamera;
  24.     SurfaceHolder mHolder;
  25.     Context ctx;
  26.    
  27.     @SuppressWarnings("deprecation")
  28.     public CameraPreview(Context context,Camera camera) {
  29.         super(context);
  30.         this.ctx=context;
  31.         mCamera=camera;
  32.         mHolder=this.getHolder();
  33.         mHolder.addCallback(this);
  34.         mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  35.     }
  36.  
  37.     @Override
  38.     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
  39.         if(holder.getSurface()==null)
  40.         {
  41.             return;
  42.         }
  43.         try
  44.         {
  45.             mCamera.stopPreview();
  46.         }
  47.         catch(Exception e)
  48.         {
  49.             Log.e("CamTestActivity","Tried to shut down non existant preview",e);
  50.         }
  51.         //Set orientation and display size here:
  52.         Parameters params=mCamera.getParameters();
  53.         Size previewSize=getBestPreviewSize(params);
  54.         Size desiredPictureSize=getDesiredPictureSize(params);
  55.         if(holder!=null && hasMacroFocus(params))
  56.             params.setFocusMode(Parameters.FOCUS_MODE_MACRO);//only added in API 14...
  57.         else if(holder!=null && hasAutoFocus(params)){
  58.             params.setFocusMode(Parameters.FOCUS_MODE_AUTO);
  59.             }
  60.         else
  61.         {
  62.             Log.d("CameraPreview", "The holder has not been created yet or there is no autofocus");
  63.         }
  64.        
  65.         params.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO);
  66.         setCameraDisplayOrientation(ctx,Camera.CameraInfo.CAMERA_FACING_BACK, mCamera);
  67.         params.setPreviewSize(previewSize.width, previewSize.height);
  68.         params.setPictureSize(desiredPictureSize.width, desiredPictureSize.height);
  69.         mCamera.setParameters(params);
  70.         try {
  71.             mCamera.setPreviewDisplay(holder);
  72.         } catch (IOException e) {
  73.             Log.e("CameraPreview", "Camera preview displayed could not be changed to mHolder",e);
  74.         }
  75.         mCamera.startPreview();
  76.     }
  77.  
  78.     @Override
  79.     public void surfaceCreated(SurfaceHolder holder) {
  80.         try
  81.         {
  82.             mCamera.setPreviewDisplay(holder);
  83.             mCamera.startPreview();
  84.         }
  85.         catch(IOException e)
  86.         {
  87.             Log.e("CameraPreview","Error getting camera preview",e);
  88.         }
  89.     }
  90.  
  91.     @Override
  92.     public void surfaceDestroyed(SurfaceHolder holder) {
  93.         // TODO Auto-generated method stub
  94.         //empty method...take care of this in your Activity
  95.     }
  96.    
  97.     private Size getDesiredPictureSize(Parameters params)
  98.     {
  99.         //Resolution is widthxheight
  100.         Size result=null;
  101.         //boolean isDesiredValue=false;
  102.         final int minArea=500*500; 
  103.         final int maxArea=1000*1000;
  104.         List<Size> supportedSizeList=params.getSupportedPictureSizes();
  105.         for(Size size:supportedSizeList)
  106.         {
  107.             if(size.width*size.height>minArea && size.width*size.height<maxArea)
  108.             {
  109.                 if(result==null)
  110.                     result=size;
  111.                 else
  112.                 {
  113.                     int resultArea=result.width*result.height;
  114.                     int sizeArea=size.width*size.height;
  115.                     if(resultArea<sizeArea)
  116.                     {  
  117.                         result=size;
  118.                     }  
  119.                 }
  120.             }
  121.         }
  122.         return result;
  123.     }
  124.    
  125.     private Size getBestPreviewSize(Parameters params)
  126.     {
  127.         Size result=null;
  128.         ArrayList<Size> mSupportedSizes=(ArrayList<Size>) params.getSupportedPreviewSizes();
  129.         for(Size size:mSupportedSizes)
  130.         {
  131.            
  132.             if(result==null)
  133.                 result=size;
  134.             else
  135.             {
  136.                 int resultArea=result.width*result.height;
  137.                 int sizeArea=size.width*size.height;
  138.                 if(resultArea<sizeArea)
  139.                     result=size;
  140.             }
  141.            
  142.         }
  143.         Log.d("CameraPreview", "Camera Preview size set to "+result.width+"X"+result.height);
  144.         return result;
  145.     }
  146.    
  147.     public boolean hasMacroFocus(Parameters params)
  148.     {
  149.         List<String> supportedFocusModes=params.getSupportedFocusModes();
  150.         if(supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_MACRO))
  151.             return true;
  152.         return false;
  153.     }
  154.    
  155.     public boolean hasAutoFocus(Parameters params)
  156.     {
  157.         List<String> focusModes=params.getSupportedFocusModes();
  158.        
  159.         if(focusModes!=null && focusModes.contains(Parameters.FOCUS_MODE_AUTO)){
  160.             return true;
  161.         }
  162.         else if(focusModes==null)
  163.         {
  164.             Log.d("CameraPreview", "Error getting autofocus mode list");
  165.         }
  166.         return false;
  167.     }
  168.    
  169.     public boolean hasAutoFlash(Parameters params)
  170.     {
  171.         List<String> supportedFlashModes=params.getSupportedFlashModes();
  172.         if(supportedFlashModes.contains(Parameters.FLASH_MODE_AUTO))
  173.             return true;
  174.         return false;
  175.     }
  176.    
  177.    
  178.     //I have set orientation to landscape...if orientation issues persist...use this
  179.     //code from developer.android.com-javadoc
  180.        @TargetApi(Build.VERSION_CODES.GINGERBREAD)
  181.        public static void setCameraDisplayOrientation(Context context,
  182.          int cameraId, android.hardware.Camera camera) {
  183.      android.hardware.Camera.CameraInfo info =
  184.              new android.hardware.Camera.CameraInfo();
  185.      android.hardware.Camera.getCameraInfo(cameraId, info);
  186.      int rotation = ((Activity) context).getWindowManager().getDefaultDisplay()
  187.              .getRotation();
  188.      int degrees = 0;
  189.      switch (rotation) {
  190.          case Surface.ROTATION_0: degrees = 0; break;
  191.          case Surface.ROTATION_90: degrees = 90; break;
  192.          case Surface.ROTATION_180: degrees = 180; break;
  193.          case Surface.ROTATION_270: degrees = 270; break;
  194.      }
  195.  
  196.      int result;
  197.      if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
  198.          result = (info.orientation + degrees) % 360;
  199.          result = (360 - result) % 360;  // compensate the mirror
  200.      } else {  // back-facing
  201.          result = (info.orientation - degrees + 360) % 360;
  202.      }
  203.      camera.setDisplayOrientation(result);
  204.      Camera.Parameters params=camera.getParameters();
  205.      params.setRotation(result);
  206.      camera.setParameters(params);
  207.  }
  208. }
Advertisement
Add Comment
Please, Sign In to add comment