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下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM