zoukankan      html  css  js  c++  java
  • Camera的使用(二)

      上一节中,记录了如何使用SurfaceView对摄像头进行预览( http://www.cnblogs.com/fishbone-lsy/p/5240504.html )。这一节,简单记录一下拍照的实现。

      为了简单,我将单击预览画面作为拍照的触发动作,拍照之后,将照片存在手机本地的相册中。

      拍照的方法如下:

        /**
         * 拍照
         */
        private void doTakePicture(){
            Camera.ShutterCallback shutterCallback = new Camera.ShutterCallback() {
                @Override
                public void onShutter() {
    
                }
            };
    
            if (mCamera != null){
                // 拍照
                mCamera.takePicture(shutterCallback, null, new Camera.PictureCallback() {
                    @Override
                    public void onPictureTaken(byte[] data, Camera camera) {
                        if (data != null){
                            Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0 , data.length);
                            if (bitmap != null){
                                FileUtil.saveBitmap(bitmap , onSavePictureListener);
                            }
                        }
                    }
                });
            }
        }

      我们不能看出,其实拍照只有一句话mCamera.takePicture。但是这个方法,可以输入4个监听,这还是比较少见的一个方法。幸好,方法定义的注释中写明了,四个监听分别有什么作用

      

         * @param shutter   the callback for image capture moment, or null
         * @param raw       the callback for raw (uncompressed) image data, or null
         * @param postview  callback with postview image data, may be null
         * @param jpeg      the callback for JPEG image data, or null

      我们暂时只使用了最后一个监听,在拍照完成后,将JPEG的data保存起来。

      保存的代码比较简单,如下:  

        public static void saveBitmap(final Bitmap bm , final OnFinishListener listener){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
                    String pathStr = path.getAbsolutePath() + "/Camera/s.png";
                    File file = new File(pathStr);
                    try {
                        FileOutputStream fileOutputStream = new FileOutputStream(file);
                        bm.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
                        fileOutputStream.flush();
                        fileOutputStream.close();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                    if (bm != null && !bm.isRecycled()){
                        bm.recycle();
                    }
                    if (listener != null){
                        listener.onFinished();
                    }
                }
            }).start();
        }
    }
        FileUtil.OnFinishListener onSavePictureListener = new FileUtil.OnFinishListener() {
            @Override
            public void onFinished() {
                try {
                    // 拍照完成后,相机会自动停止预览,此处重新开启相机的预览
                    mCamera.startPreview();
                } catch (Exception e) {
                    mCamera.release();
                    mCamera = null;
                }
            }
        };

    Done












  • 相关阅读:
    过国内外的waf的一些奇淫绝技<转>
    杂七杂八的敏感文件注释<持续更新帖>
    [讨论]“传递式”的攻击思想<转LN>
    无线hacking集合贴,持续更新~
    dede找后台《转》
    开源MFC扩展界面库:Ultimate Toolbox的编译(转)
    【转】Windows环境下设置Tomcat6启动参数
    [转]关于dll文件的生成以及找不到jni.h的解决办法
    VBA 7788
    ODBC连接EXCEL的一些问题
  • 原文地址:https://www.cnblogs.com/fishbone-lsy/p/5247505.html
Copyright © 2011-2022 走看看