zoukankan      html  css  js  c++  java
  • android开发 无预览定时拍照

    demo实现功能:

    打开主页面自动启动定时拍照,10s拍一次。

    注意事项,初始化摄像头之后不能立即拍照,否则无效,必须等待几秒后才能拍。这里用的是Handler进行延时处理拍照消息的。

    package com.feijian.takephotodemo;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.List;
    import android.app.Activity;
    import android.content.Context;
    import android.content.pm.PackageManager;
    import android.hardware.Camera;
    import android.hardware.Camera.AutoFocusCallback;
    import android.hardware.Camera.PictureCallback;
    import android.hardware.Camera.Size;
    import android.os.Environment;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.widget.FrameLayout;
    
    /**
     * 设置定时拍照功能
     * @author huqiang
     *
     */
    public class InitTimetoTakePic {
    
        private static InitTimetoTakePic mInstance;
        Activity mContext;
        static FrameLayout mSurfaceViewFrame;
        private static Camera mCamera;
        private static CameraPreview mPreview;
        
        static String TAG = InitTimetoTakePic.class.getSimpleName();
        private InitTimetoTakePic(Activity context)
        {
            this.mContext = context;
        }
        public synchronized static InitTimetoTakePic getInstance(Activity context)
        {
            if(mInstance ==null)
            {
                mInstance = new InitTimetoTakePic(context);
                
            }
            return mInstance;
        }
        public void initView(FrameLayout surfaceViewFrame)
        {
            mSurfaceViewFrame = surfaceViewFrame;
        }
        /**
         * 启动定时拍照并上传功能
         */
        Handler mHandler = new Handler()
        {
            @Override
            public void handleMessage(Message msg) {
                switch(msg.what)
                {
                case 1:
                     Log.v(TAG, "开始拍照");
                     initCarema();
                    break;
                case 2:
                    mCamera.autoFocus(new AutoFocusCallback() {
                        
                        @Override
                        public void onAutoFocus(boolean success, Camera camera) {
                            // 从Camera捕获图片
                            Log.v(TAG, "自动聚焦111"+success);
                            mCamera.takePicture(null, null, mPicture);
                            mHandler.sendEmptyMessageDelayed(1, 5*1000);
                        }
                    });
                    break;
                }
            }
        };
        public void start()
        {
            mHandler.sendEmptyMessageDelayed(1, 7*1000); //7s 后开始启动相机
        }
        private void initCarema()
        {
            Log.v(TAG, "initCarema");
            if(mCamera==null)
            {
                Log.v(TAG, "camera=null");
                mCamera = getCameraInstance();
                mPreview = new CameraPreview(mContext, mCamera);
                mSurfaceViewFrame.removeAllViews();
                mSurfaceViewFrame.addView(mPreview);
            }
            Log.v(TAG, mCamera==null ?"mCamera is null":"mCamera is not null");
            mCamera.startPreview();
            mHandler.sendEmptyMessageDelayed(2, 3*1000); //3s后拍照
        }
        /** 检测设备是否存在Camera硬件 */
        private boolean checkCameraHardware(Context context) {
            if (context.getPackageManager().hasSystemFeature(
                    PackageManager.FEATURE_CAMERA)) {
                // 存在
                return true;
            } else {
                // 不存在
                return false;
            }
        }
    
        /** 打开一个Camera */
        public static Camera getCameraInstance() {
            Camera c = null;
            try {
                c = Camera.open(); 
                c.setDisplayOrientation(90);
                Camera.Parameters mParameters = c.getParameters();
                //可以用得到当前所支持的照片大小,然后
                List<Size> ms = mParameters.getSupportedPictureSizes();
                mParameters.setPictureSize(ms.get(0).width, ms.get(0).height);  //默认最大拍照取最大清晰度的照片
                c.setParameters(mParameters);
            } catch (Exception e) {
                Log.d(TAG, "打开Camera失败失败");
            }
            return c; 
        }
    
        private PictureCallback mPicture = new PictureCallback() {
    
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                // 获取Jpeg图片,并保存在sd卡上
                String path = Environment.getExternalStorageDirectory().getAbsolutePath() +"/data/data/";
                File dirF = new File(path);
                if(!dirF.exists())
                {
                    dirF.mkdirs();
                }
                File pictureFile = new File(path + System.currentTimeMillis()+ ".jpg");
                try {
                    FileOutputStream fos = new FileOutputStream(pictureFile);
                    fos.write(data);
                    fos.close();
                    Log.d(TAG, "保存图成功");
                } catch (Exception e) {
                    Log.d(TAG, "保存图片失败");
                    e.printStackTrace();
                }
                releaseCarema();
            }
        };
        public void releaseCarema()
        {
            if(mCamera!=null){
                mCamera.stopPreview();
                mCamera.release();
                mCamera=null;
            }
        }
    }

    demo下载

  • 相关阅读:
    《金字塔原理》听书笔记
    凡事有交代
    关于马云不用淘宝不用支付宝的想法
    jenkins如何在一台机器上开启多个slave
    jenkins结合docker
    flask-assets使用介绍
    touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
    JS中event.preventDefault()取消默认事件能否还原?
    flask前端优化:css/js/html压缩
    What's New In DevTools (Chrome 59)来看看最新Chrome 59的开发者工具又有哪些新功能
  • 原文地址:https://www.cnblogs.com/feijian/p/4958481.html
Copyright © 2011-2022 走看看