您当前的位置: 首页 >  android

xiangzhihong8

暂无认证

  • 0浏览

    0关注

    1324博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

android 自定义相机

xiangzhihong8 发布时间:2016-04-14 11:31:48 ,浏览量:0

老规矩,先上一下项目地址:GitHub:https://github.com/xiangzhihong/CameraDemo

方式:

  • 调用Camera API 自定义相机
  • 调用系统相机

由于需求不同,所以选择的方案固然也不同,至于第二种调用系统相机,这里就不过多讲解了,使用Intent对象设置一个Action动作即可,跳转时使用startActivityForResult,然后在onActivityResult处理相关数据便可,关键代码:

[java]  view plain  copy
 print ?
  1. intent.setAction("android.media.action.STILL_IMAGE_CAMERA");  

至于使用,较常见的一般是应用中用户上传头像的时候调用,然后返回处理图像数据。

而第一种自定义相机的方式使用也十分普遍,但是要做好这个模块,相对来说还是有一定难度的,之前分享过一个Github上的开源相机的项目,项目由美国的一个团队开发,集 拍照、摄影、各种特效动画 等功能与一身,本人之前研究了下,发现功能比较全面也很强大,抠出来单独拍照那一个模块,我滴妈呀,真TM费劲!相机不管是预览还是拍摄图像都还是很清晰的,自己当时也写了一个,比较操蛋,只能怪自己对这一块的优化了解浅显吧!特别是预览的时候,聚焦完成后,焦点周边会出现很多白色的噪点,密密麻麻,特别严重,头疼的很。不过也总算解决了,灰常感谢USA的那个什么什么团队的开源相机程序。经过自己改造后的预览效果图:

下面看下这个项目的效果图,我也把地址甩底下,大伙感兴趣的自行Clone研究(或者闲的蛋疼也可以抽时间剥离开每一个模块学习,作为日后的知识储备),里面也用到了这个Android中读取图片EXIF元数据之metadata-extractor的使用。

相机开发简介

下面说说在Android中调用Camera来定义相机的最基本步骤:

  1. 打开相机 —— 调用Camera的open()方法。
  2. 获取拍照参数 —— 调用Camera的getParameters()方法,返回Camera.Parameters对象。
  3. 拍照参数设置 —— 调用Camera.Parameters对象。
  4. 拍照参数控制 —— 调用Camera的setParameters(),并将Camera.Parameters对象作为参数传入。注:Android2.3.3之后不用设置。
  5. 预览取景 —— 调用Camera的startPreview()方法,在之前注意调用Camera的setPreviewDisplay(SurfaceHolder holder)设置使用哪个SurfaceView来显示取得的图片。
  6. 拍照 —— 调用Camera的takePicture()
  7. 停止预览 —— 调用Camera的stopPreview()方法
  8. 资源释放 —— Camera.release()

开启和关闭预览的联系如下:Camera ---- SurfaceHolder ------ SurfaceView

关于SurfaceHolder.Callback必须实现的3个方法:

surfaceCreated() 该方法在surfaceView被Create时调用 surfaceChanged() 该方法是当surfaceView发生改变后调用 surfaceDestroyed() 这个不用说了,销毁时调用 surfaceHolder通过addCallBack()方法将响应的接口绑定

注:必要Camera权限,例如:

[html]  view plain  copy
 print ?
  1.   
  2.   
  3.   
  4.   
  5.   
  6.   
  7.   
  8.   
  9.   

关于Camera下的Parameters类,其中封装了我们需要的大部分功能,下面做个简单介绍:

  1. setPictureFormat() 方法用于设置相机照片的格式,其参数是一个字符型参数,位于PixelFormat类中,如:PixelFormat.JPEG。
  2. setSceneMode() 方法用于设置相机场景类型,其参是是一个字符型参数,位于Parameters类中,以SCENE_MODE_开头。
  3. setZoom() 方法用于设置相机焦距,其参数是一个整型的参数,该参数的范围是0到Camera.getParameters().getMaxZoom()。
  4. setPictureSize() 方法用于设置相机照片的大小,参数为整型。
  5. setWhiteBalance() 方法用于设置相机照片白平衡,其参数是一个字符型,位于Parameters类中,以WHITE_BALANCE开头。
  6. setJpegQuality() 方法用于设置相机照片的质量,其参数是一个整型参数,取值范围为1到100。
  7. setFlashMode() 方法用于设置闪光灯的类型,其参数是一个字符型参数,位于Parameters类中,以FLASH_MODE_开头。
  8. setColorEffect() 方法用于设置照片颜色特效的类型,其参数是一个字符型参数,位于Parameters类中,以EFFECT_开头。

本程序模块效果图及示例

下面分享本篇Blog的示例相机模块,此功能模块并非上面开源项目中的剥离出来的,看下效果图咯:

         

         

效果看着还可以吧(不点赞也太不给面子了吧  - . - ),下面个出主界面的布局代码:

[html]  view plain  copy
 print ?
  1.   
  2.   
  3.   
  4.       
  5.       
  6.   
  7.       
  8.   
  9.       
  10.   
  11.           
  12.   
  13.           
  14.   
  15.           
  16.   
  17.           
  18.   
  19.           
  20.   
  21.           
  22.   
  23.               
  24.   
  25.               
  26.   
  27.               
  28.           
  29.       
  30.   
  31.   

下面是核心模块 CameraPreview 类:

[java]  view plain  copy
 print ?
  1. public class CameraPreview extends ViewGroup implements SurfaceHolder.Callback, Camera.AutoFocusCallback {  
  2.   
  3.     private SurfaceView mSurfaceView;  
  4.     private SurfaceHolder mHolder;  
  5.     private Size mPreviewSize;  
  6.     private Size adapterSize;  
  7.     //private List mSupportedPreviewSizes;  
  8.     private Camera mCamera;  
  9.     private boolean isSupportAutoFocus = false;  
  10.     private Camera.Parameters parameters = null;  
  11.     private Context mContext;  
  12.     //private int mCurrentCameraId = 0;  
  13.     private int screenWidth;  
  14.     private int screenHeight;  
  15.   
  16.     CameraPreview(Context context, SurfaceView sv) {  
  17.         super(context);  
  18.         mContext = context;  
  19.         mSurfaceView = sv;  
  20.         mHolder = mSurfaceView.getHolder();  
  21.         mHolder.addCallback(this);  
  22.         mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  23.         mHolder.setKeepScreenOn(true);  
  24.         isSupportAutoFocus = context.getPackageManager().hasSystemFeature(  
  25.                 PackageManager.FEATURE_CAMERA_AUTOFOCUS);  
  26.         DisplayMetrics dm = new DisplayMetrics();  
  27.         ((Activity) mContext).getWindowManager().getDefaultDisplay().getMetrics(dm);  
  28.         screenWidth = dm.widthPixels;  
  29.         screenHeight = dm.heightPixels;  
  30.     }  
  31.   
  32.     public void setCamera(Camera camera) {  
  33.         mCamera = camera;  
  34.         initCamera();  
  35.     }  
  36.   
  37.     public void initCamera() {  
  38.         if (mCamera != null) {  
  39.             Camera.Parameters params = mCamera.getParameters();  
  40.             //mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();  
  41.             requestLayout();  
  42.             if (mPreviewSize == null) {  
  43.                 mPreviewSize = findBestPreviewResolution();  
  44.             }  
  45.             if (adapterSize == null) {  
  46.                 adapterSize = findBestPictureResolution();  
  47.             }  
  48.             if (adapterSize != null) {  
  49.                 params.setPictureSize(adapterSize.width, adapterSize.height);  
  50.             }  
  51.             if (mPreviewSize != null) {  
  52.                 params.setPreviewSize(mPreviewSize.width, mPreviewSize.height);  
  53.             }  
  54.             params.setPictureFormat(PixelFormat.JPEG);  
  55.             List focusModes = params.getSupportedFocusModes();  
  56.             if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {  
  57.                 // set the focus mode  
  58.                 params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);  
  59.                 // set Camera parameters  
  60.                 mCamera.setParameters(params);  
  61.             }  
  62.             setDispaly(params, mCamera);  
  63.             //setCameraDisplayOrientation((Activity) mContext, mCurrentCameraId, mCamera);  
  64.             mCamera.setParameters(params);  
  65.         }  
  66.     }  
  67.   
  68.     //控制图像的正确显示方向  
  69.     private void setDispaly(Camera.Parameters parameters, Camera camera) {  
  70.         if (Build.VERSION.SDK_INT >= 8) {  
  71.             setDisplayOrientation(camera, 90);  
  72.         } else {  
  73.             parameters.setRotation(90);  
  74.         }  
  75.     }  
  76.   
  77.     //实现的图像的正确显示  
  78.     private void setDisplayOrientation(Camera camera, int i) {  
  79.         Method downPolymorphic;  
  80.         try {  
  81.             downPolymorphic = camera.getClass().getMethod("setDisplayOrientation",  
  82.                     new Class[]{int.class});  
  83.             if (downPolymorphic != null) {  
  84.                 downPolymorphic.invoke(camera, new Object[]{i});  
  85.             }  
  86.         } catch (Exception e) {  
  87.             e.printStackTrace();  
  88.         }  
  89.     }  
  90.   
  91.     public static void setCameraDisplayOrientation(Activity activity,  
  92.             int cameraId, android.hardware.Camera camera) {  
  93.         android.hardware.Camera.CameraInfo info =  
  94.                 new android.hardware.Camera.CameraInfo();  
  95.         android.hardware.Camera.getCameraInfo(cameraId, info);  
  96.         int rotation = activity.getWindowManager().getDefaultDisplay()  
  97.                 .getRotation();  
  98.         int degrees = 0;  
  99.         switch (rotation) {  
  100.         case Surface.ROTATION_0:  
  101.             degrees = 0;  
  102.             break;  
  103.         case Surface.ROTATION_90:  
  104.             degrees = 90;  
  105.             break;  
  106.         case Surface.ROTATION_180:  
  107.             degrees = 180;  
  108.             break;  
  109.         case Surface.ROTATION_270:  
  110.             degrees = 270;  
  111.             break;  
  112.         }  
  113.   
  114.         int result;  
  115.         if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {  
  116.             result = (info.orientation + degrees) % 360;  
  117.             result = (360 - result) % 360;  // compensate the mirror  
  118.         } else {  // back-facing  
  119.             result = (info.orientation - degrees + 360) % 360;  
  120.         }  
  121.         camera.setDisplayOrientation(result);  
  122.     }  
  123.   
  124.     @Override  
  125.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  126.         final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);  
  127.         final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);  
  128.         setMeasuredDimension(width, height);  
  129.         //        if (mSupportedPreviewSizes != null) {  
  130.         //             mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);  
  131.         //        }  
  132.     }  
  133.   
  134.     @Override  
  135.     protected void onLayout(boolean changed, int l, int t, int r, int b) {  
  136.         if (changed && getChildCount() > 0) {  
  137.             final View child = getChildAt(0);  
  138.   
  139.             final int width = r - l;  
  140.             final int height = b - t;  
  141.   
  142.             int previewWidth = width;  
  143.             int previewHeight = height;  
  144.             if (mPreviewSize != null) {  
  145.                 previewWidth = mPreviewSize.width;  
  146.                 previewHeight = mPreviewSize.height;  
  147.             }  
  148.   
  149.             // Center the child SurfaceView within the parent.  
  150.             if (width * previewHeight > height * previewWidth) {  
  151.                 final int scaledChildWidth = previewWidth * height / previewHeight;  
  152.                 child.layout((width - scaledChildWidth) / 2, 0,  
  153.                         (width + scaledChildWidth) / 2, height);  
  154.             } else {  
  155.                 final int scaledChildHeight = previewHeight * width / previewWidth;  
  156.                 child.layout(0, (height - scaledChildHeight) / 2,  
  157.                         width, (height + scaledChildHeight) / 2);  
  158.             }  
  159.         }  
  160.     }  
  161.   
  162.     public void surfaceCreated(SurfaceHolder holder) {  
  163.         // The Surface has been created, acquire the camera and tell it where  
  164.         // to draw.  
  165.         try {  
  166.             if (mCamera != null) {  
  167.                 mCamera.setPreviewDisplay(holder);  
  168.             }  
  169.         } catch (IOException e) {  
  170.             if (null != mCamera) {  
  171.                 mCamera.release();  
  172.                 mCamera = null;  
  173.   
  174.             }  
  175.             e.printStackTrace();  
  176.         }  
  177.     }  
  178.   
  179.     public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {  
  180.         if (holder.getSurface() == null) {  
  181.             return;  
  182.         }  
  183.         if (mCamera != null) {  
  184.             Camera.Parameters parameters = mCamera.getParameters();  
  185.             parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);  
  186.             mCamera.setParameters(parameters);  
  187.             try {  
  188.                 mCamera.setPreviewDisplay(holder);  
  189.             } catch (IOException e) {  
  190.                 e.printStackTrace();  
  191.             }  
  192.             mCamera.startPreview();  
  193.             reAutoFocus();  
  194.         }  
  195.     }  
  196.   
  197.     public void surfaceDestroyed(SurfaceHolder holder) {  
  198.         // Surface will be destroyed when we return, so stop the preview.  
  199.         if (mCamera != null) {  
  200.             mCamera.stopPreview();  
  201.         }  
  202.     }  
  203.   
  204.     /** 
  205.      * 最小预览界面的分辨率 
  206.      */  
  207.     private static final int MIN_PREVIEW_PIXELS = 480 * 320;  
  208.     /** 
  209.      * 最大宽高比差 
  210.      */  
  211.     private static final double MAX_ASPECT_DISTORTION = 0.15;  
  212.   
  213.     /** 
  214.      * 找出最适合的预览界面分辨率 
  215.      * 
  216.      * @return 
  217.      */  
  218.     private Camera.Size findBestPreviewResolution() {  
  219.         Camera.Parameters cameraParameters = mCamera.getParameters();  
  220.         Camera.Size defaultPreviewResolution = cameraParameters.getPreviewSize();  
  221.   
  222.         List rawSupportedSizes = cameraParameters.getSupportedPreviewSizes();  
  223.         if (rawSupportedSizes == null) {  
  224.             return defaultPreviewResolution;  
  225.         }  
  226.   
  227.         // 按照分辨率从大到小排序  
  228.         List supportedPreviewResolutions = new ArrayList(rawSupportedSizes);  
  229.         Collections.sort(supportedPreviewResolutions, new Comparator() {  
  230.             @Override  
  231.             public int compare(Camera.Size a, Camera.Size b) {  
  232.                 int aPixels = a.height * a.width;  
  233.                 int bPixels = b.height * b.width;  
  234.                 if (bPixels  aPixels) {  
  235.                     return 1;  
  236.                 }  
  237.                 return 0;  
  238.             }  
  239.         });  
  240.   
  241.         StringBuilder previewResolutionSb = new StringBuilder();  
  242.         for (Camera.Size supportedPreviewResolution : supportedPreviewResolutions) {  
  243.             previewResolutionSb.append(supportedPreviewResolution.width).append('x').append(supportedPreviewResolution.height)  
  244.             .append(' ');  
  245.         }  
  246.   
  247.   
  248.         // 移除不符合条件的分辨率  
  249.         double screenAspectRatio = (double) screenWidth  
  250.         / screenHeight;  
  251.         Iterator it = supportedPreviewResolutions.iterator();  
  252.         while (it.hasNext()) {  
  253.             Camera.Size supportedPreviewResolution = it.next();  
  254.             int width = supportedPreviewResolution.width;  
  255.             int height = supportedPreviewResolution.height;  
  256.   
  257.             // 移除低于下限的分辨率,尽可能取高分辨率  
  258.             if (width * height height,我们设置的portrait模式中,width height;  
  259.             int maybeFlippedWidth = isCandidatePortrait ? height : width;  
  260.             int maybeFlippedHeight = isCandidatePortrait ? width : height;  
  261.             double aspectRatio = (double) maybeFlippedWidth / (double) maybeFlippedHeight;  
  262.             double distortion = Math.abs(aspectRatio - screenAspectRatio);  
  263.             if (distortion > MAX_ASPECT_DISTORTION) {  
  264.                 it.remove();  
  265.                 continue;  
  266.             }  
  267.   
  268.             // 找到与屏幕分辨率完全匹配的预览界面分辨率直接返回  
  269.             if (maybeFlippedWidth == screenWidth  
  270.                     && maybeFlippedHeight == screenHeight) {  
  271.                 return supportedPreviewResolution;  
  272.             }  
  273.         }  
  274.   
  275.   
  276.         // 如果没有找到合适的,并且还有候选的像素,则设置其中最大比例的,对于配置比较低的机器不太合适  
  277.         if (!supportedPreviewResolutions.isEmpty()) {  
  278.             Camera.Size largestPreview = supportedPreviewResolutions.get(0);  
  279.             return largestPreview;  
  280.         }  
  281.   
  282.   
  283.         // 没有找到合适的,就返回默认的  
  284.   
  285.         return defaultPreviewResolution;  
  286.     }  
  287.   
  288.   
  289.     private Camera.Size findBestPictureResolution() {  
  290.         Camera.Parameters cameraParameters = mCamera.getParameters();  
  291.         List supportedPicResolutions = cameraParameters.getSupportedPictureSizes(); // 至少会返回一个值  
  292.   
  293.         StringBuilder picResolutionSb = new StringBuilder();  
  294.         for (Camera.Size supportedPicResolution : supportedPicResolutions) {  
  295.             picResolutionSb.append(supportedPicResolution.width).append('x')  
  296.             .append(supportedPicResolution.height).append(" ");  
  297.         }  
  298.   
  299.         Camera.Size defaultPictureResolution = cameraParameters.getPictureSize();  
  300.   
  301.         // 排序  
  302.         List sortedSupportedPicResolutions = new ArrayList(  
  303.                 supportedPicResolutions);  
  304.         Collections.sort(sortedSupportedPicResolutions, new Comparator() {  
  305.             @Override  
  306.             public int compare(Camera.Size a, Camera.Size b) {  
  307.                 int aPixels = a.height * a.width;  
  308.                 int bPixels = b.height * b.width;  
  309.                 if (bPixels  aPixels) {  
  310.                     return 1;  
  311.                 }  
  312.                 return 0;  
  313.             }  
  314.         });  
  315.   
  316.   
  317.         // 移除不符合条件的分辨率  
  318.         double screenAspectRatio = screenWidth  
  319.         / (double) screenHeight;  
  320.         Iterator it = sortedSupportedPicResolutions.iterator();  
  321.         while (it.hasNext()) {  
  322.             Camera.Size supportedPreviewResolution = it.next();  
  323.             int width = supportedPreviewResolution.width;  
  324.             int height = supportedPreviewResolution.height;  
  325.   
  326.             // 在camera分辨率与屏幕分辨率宽高比不相等的情况下,找出差距最小的一组分辨率  
  327.             // 由于camera的分辨率是width>height,我们设置的portrait模式中,width height;  
  328.             int maybeFlippedWidth = isCandidatePortrait ? height : width;  
  329.             int maybeFlippedHeight = isCandidatePortrait ? width : height;  
  330.             double aspectRatio = (double) maybeFlippedWidth / (double) maybeFlippedHeight;  
  331.             double distortion = Math.abs(aspectRatio - screenAspectRatio);  
  332.             if (distortion > MAX_ASPECT_DISTORTION) {  
  333.                 it.remove();  
  334.                 continue;  
  335.             }  
  336.         }  
  337.   
  338.         // 如果没有找到合适的,并且还有候选的像素,对于照片,则取其中最大比例的,而不是选择与屏幕分辨率相同的  
  339.         if (!sortedSupportedPicResolutions.isEmpty()) {  
  340.             return sortedSupportedPicResolutions.get(0);  
  341.         }  
  342.   
  343.         // 没有找到合适的,就返回默认的  
  344.         return defaultPictureResolution;  
  345.     }  
  346.   
  347.     private Size getOptimalPreviewSize(List sizes, int w, int h) {  
  348.         final double ASPECT_TOLERANCE = 0.1;  
  349.         double targetRatio = (double) w / h;  
  350.         if (sizes == null)  
  351.             return null;  
  352.   
  353.         Size optimalSize = null;  
  354.         double minDiff = Double.MAX_VALUE;  
  355.   
  356.         int targetHeight = h;  
  357.   
  358.         // Try to find an size match aspect ratio and size  
  359.         for (Size size : sizes) {  
  360.             double ratio = (double) size.width / size.height;  
  361.             if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)  
  362.                 continue;  
  363.             if (Math.abs(size.height - targetHeight)  0) {  
  364.             List areas = new ArrayList();  
  365.             WindowManager wm = (WindowManager) getContext()  
  366.                     .getSystemService(Context.WINDOW_SERVICE);  
  367.             //xy变换了  
  368.             int rectY = -x * 2000 / wm.getDefaultDisplay().getWidth() + 1000;  
  369.             int rectX = y * 2000 / wm.getDefaultDisplay().getHeight() - 1000;  
  370.             int left = rectX  900 ? 1000 : rectY + 100;  
  371.             Rect area1 = new Rect(left, top, right, bottom);  
  372.             areas.add(new Camera.Area(area1, 800));  
  373.             parameters.setMeteringAreas(areas);  
  374.         }  
  375.   
  376.         parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);  
  377.     }  
  378.   
  379.     @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)  
  380.     public void focusOnTouch(MotionEvent event) {  
  381.         Rect focusRect = calculateTapArea(event.getRawX(), event.getRawY(), 1f);  
  382.         Rect meteringRect = calculateTapArea(event.getRawX(), event.getRawY(), 1.5f);  
  383.   
  384.         Camera.Parameters parameters = mCamera.getParameters();  
  385.         parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);  
  386.   
  387.         if (parameters.getMaxNumFocusAreas() > 0) {  
  388.             List focusAreas = new ArrayList();  
  389.             focusAreas.add(new Camera.Area(focusRect, 1000));  
  390.   
  391.             parameters.setFocusAreas(focusAreas);  
  392.         }  
  393.   
  394.         if (parameters.getMaxNumMeteringAreas() > 0) {  
  395.             List meteringAreas = new ArrayList();  
  396.             meteringAreas.add(new Camera.Area(meteringRect, 1000));  
  397.   
  398.             parameters.setMeteringAreas(meteringAreas);  
  399.         }  
  400.         mCamera.setParameters(parameters);  
  401.         mCamera.autoFocus(this);  
  402.     }  
  403.   
  404.     /** 
  405.      * Convert touch position x:y to {@link Camera.Area} position -1000:-1000 to 1000:1000. 
  406.      */  
  407.     private Rect calculateTapArea(float x, float y, float coefficient) {  
  408.         float focusAreaSize = 300;  
  409.         int areaSize = Float.valueOf(focusAreaSize * coefficient).intValue();  
  410.   
  411.         int centerX = (int) (x / getResolution().width * 2000 - 1000);  
  412.         int centerY = (int) (y / getResolution().height * 2000 - 1000);  
  413.   
  414.         int left = clamp(centerX - areaSize / 2, -1000, 1000);  
  415.         int right = clamp(left + areaSize, -1000, 1000);  
  416.         int top = clamp(centerY - areaSize / 2, -1000, 1000);  
  417.         int bottom = clamp(top + areaSize, -1000, 1000);  
  418.   
  419.         return new Rect(left, top, right, bottom);  
  420.     }  
  421.   
  422.     private int clamp(int x, int min, int max) {  
  423.         if (x > max) {  
  424.             return max;  
  425.         }  
  426.         if (x  0) {  
  427.             try {  
  428.                 mCurrentCameraId = 0;  
  429.                 camera = Camera.open(mCurrentCameraId);  
  430.                 camera.startPreview();  
  431.                 preview.setCamera(camera);  
  432.                 preview.reAutoFocus();  
  433.             } catch (RuntimeException ex) {  
  434.                 Toast.makeText(mContext, "未发现相机", Toast.LENGTH_LONG).show();  
  435.             }  
  436.         }  
  437.   
  438.     }  
  439.   
  440.   
  441.   
  442.     @Override  
  443.     protected void onPause() {  
  444.         if (camera != null) {  
  445.             camera.stopPreview();  
  446.             preview.setCamera(null);  
  447.             camera.release();  
  448.             camera = null;  
  449.             preview.setNull();  
  450.         }  
  451.         super.onPause();  
  452.   
  453.     }  
  454.   
  455.   
  456.     private void resetCam() {  
  457.         camera.startPreview();  
  458.         preview.setCamera(camera);  
  459.     }  
  460.   
  461.   
  462.     ShutterCallback shutterCallback = new ShutterCallback() {  
  463.         public void onShutter() {  
  464.         }  
  465.     };  
  466.   
  467.   
  468.     PictureCallback rawCallback = new PictureCallback() {  
  469.         public void onPictureTaken(byte[] data, Camera camera) {  
  470.         }  
  471.     };  
  472.   
  473.   
  474.     PictureCallback jpegCallback = new PictureCallback() {  
  475.         public void onPictureTaken(byte[] data, Camera camera) {  
  476.   
  477.             new SaveImageTask(data).execute();  
  478.             resetCam();  
  479.         }  
  480.     };  
  481.   
  482.   
  483.     @Override  
  484.     public boolean onTouch(View v, MotionEvent event) {  
  485.         try {  
  486.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {  
  487.                 preview.pointFocus(event);  
  488.             }  
  489.         } catch (Exception e) {  
  490.             e.printStackTrace();  
  491.         }  
  492.   
  493.         RelativeLayout.LayoutParams layout = new RelativeLayout.LayoutParams(  
  494.                 focusIndex.getLayoutParams());  
  495.         layout.setMargins((int) event.getX() - 60, (int) event.getY() - 60, 0,0);  
  496.   
  497.         focusIndex.setLayoutParams(layout);  
  498.         focusIndex.setVisibility(View.VISIBLE);  
  499.   
  500.         ScaleAnimation sa = new ScaleAnimation(3f, 1f, 3f, 1f,  
  501.                 ScaleAnimation.RELATIVE_TO_SELF, 0.5f,  
  502.                 ScaleAnimation.RELATIVE_TO_SELF, 0.5f);  
  503.         sa.setDuration(800);  
  504.         focusIndex.startAnimation(sa);  
  505.         handler.postAtTime(new Runnable() {  
  506.             @Override  
  507.             public void run() {  
  508.                 focusIndex.setVisibility(View.INVISIBLE);  
  509.             }  
  510.         }, 800);  
  511.         return false;  
  512.     }  
  513.   
  514.   
  515.     @Override  
  516.     public void onClick(View v) {  
  517.         switch (v.getId()) {  
  518.   
  519.         /*case R.id.camera_back: 
  520.             setResult(0); 
  521.             finish(); 
  522.             break;*/  
  523.   
  524.         case R.id.camera_flip_view:  
  525.             switchCamera();  
  526.             break;  
  527.   
  528.         case R.id.flash_view:  
  529.             turnLight(camera);  
  530.             break;  
  531.   
  532.         case R.id.action_button:  
  533.             takePhoto();  
  534.             break;  
  535.   
  536.         case R.id.search:   //处理选中状态  
  537.             mBtnSearch.setSelected(true);  
  538.             mBtnTakePhoto.setSelected(false);  
  539.             break;  
  540.   
  541.         case R.id.takephoto:    //处理选中状态  
  542.             mBtnTakePhoto.setSelected(true);  
  543.             mBtnSearch.setSelected(false);  
  544.             break;  
  545.         }  
  546.     }  
  547.   
  548.     private static String getCameraPath() {  
  549.         Calendar calendar = Calendar.getInstance();  
  550.         StringBuilder sb = new StringBuilder();  
  551.         sb.append("IMG");  
  552.         sb.append(calendar.get(Calendar.YEAR));  
  553.         int month = calendar.get(Calendar.MONTH) + 1; // 0~11  
  554.         sb.append(month 
关注
打赏
1482932726
查看更多评论
立即登录/注册

微信扫码登录

0.3854s