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

时间: 2024-11-08 12:03:13

android开发 无预览定时拍照的相关文章

玩转Android Camera开发(四):预览界面四周暗中间亮,只拍摄矩形区域图片(附完整源码)

杂家前文曾写过一篇关于只拍摄特定区域图片的demo,只是比较简陋,在坐标的换算上不是很严谨,而且没有完成预览界面四周暗中间亮的效果,深以为憾,今天把这个补齐了. 在上代码之前首先交代下,这里面存在着换算的两种模式.第一种,是以屏幕上的矩形区域为基准进行换算.举个例子,屏幕中间一个 矩形框为100dip*100dip.这里一定要使用dip为单位,否则在不同的手机上屏幕呈现的矩形框大小不一样.先将这个dip换算成px,然后根据屏幕的宽和高的像素计算出矩形区域,传给Surfaceview上铺的一层Vi

【转】WP8.1开发人员预览版本已知 Bug

偶的 Lumia 920 已经升级到最新的 8.1 开发人员预览版本,使用中没有发现什么问题. 可能是因为偶玩手机的情况比较少吧!忽然看到 MS 停止此版本的更新,并说明有很多的 BUG,偶就郁闷了. 以下是从网络上复制过来的,大家看看吧. Windows Phone 8.1开发者预览版推出近1周,抢先体验和测试多多少少遇到了一些问题,有的是系统固件方面的问题,有的官方或第三方应用方面的问题,还有的是系统功能的改变带来的问题. 不想尝试新版WP8.1或者嫌麻烦的机友可以直接等今夏开始的WP8.1

文件上传(无预览模式版)

文件上传是网页的基本功能之一,这一章我们将讲解无预览模式版本 第一:网页表单显示 <body> <h1>文件上传</h1> <form action="chuli.php" method="post" enctype="multipart/form-data"> <input type="file" name="file"/> <input

Android手势识别 Camera 预览界面上显示文字 布局注意事项(merge布局)

通常在Surfaceview作为预览视频帧的载体,有时需在上面显示提示文字.以前我弄的都好好的,今天忽然发现叠加的TextView不管咋弄都出不来文字了,跟Surfaceview一起放在FrameLayout也不行,后来想到merge布局,发现也不行.大爷的,奇了怪了,最后发现了原因,原来是顺序问题.也即无论是在RelativeLayout里还是merge布局里,View是逐个叠加上去的,一层一层铺上去的.如果你先放TextView在最前面,那肯定被后面的全屏Surfaceview覆盖了.用常规

如何获取和安装Android L开发者预览版

周三谷歌推出下一个流行的移动操作系统Android L.但是只提供了简单地预览版本,稍后将提供一个开发者预览版,完整版计划在今年秋天发布. 下面我们一起来看看如何下载和安装. 在你安装AndroidL开发者预览版之前,你需要知道的几件事情: 1.此版本是不稳定的,不建议在你的常用设备上使用: 2.加载过程不是很简单,你需要借助于命令行工具并且具有错误排除能力. Google已经在下载页面和系统启动页面提示了,此次开发者预览版只适合 Nexus 5 和Nexus 7 而且不需要开发者账号. 下载系

python 开发规范 预览版

python 开发规范 预览版 本文主要参考 pep8和jumpserver开发规范,结合实际,进行修改,欢迎提出修改意见. 代码检查工具 pylint pycharm --> code --> Reformat Code 格式化当前文件代码格式 pycharm --> 右击项目 --> Inspect Code 根据pep8格式检查当前项目 基本的代码布局 导入 import x from x import y from x import y as z 禁止import x,y

Android自定义照相机 预览拍照 切换前后置摄像头

Android提供了Camera来控制拍照,步骤如下:(1)调用Camera的open()方法打开相机.(2)调用Camera的getParameters()获取拍照参数,该方法返回一个Cmera.Parameters对象.(3)调用Camera.Parameters对象对照相的参数进行设置.(4)调用Camera的setParameters(),并将Camera.Parameters对象作为参数传入,这样就可以对拍照进行参数控制,Android2.3.3以后不用设置.(5)调用Camerade

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等

仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 微信 下载地址 : 微信上传图片源码 很多网友不知道怎么获取图片路径,这里贴出来: String path = Bimp.tempSelectBitmap.get(position).getImagePath(); //部分代码如下 [java] view plain copy package co

玩转Android Camera开发(四):预览界面四周暗中间亮,仅仅拍摄矩形区域图片(附完整源代码)

杂家前文曾写过一篇关于仅仅拍摄特定区域图片的demo.仅仅是比較简陋.在坐标的换算上不是非常严谨,并且没有完毕预览界面四周暗中间亮的效果,深以为憾.今天把这个补齐了. 在上代码之前首先交代下,这里面存在着换算的两种模式.第一种,是以屏幕上的矩形区域为基准进行换算.举个样例.屏幕中间一个 矩形框为100dip*100dip.这里一定要使用dip为单位,否则在不同的手机上屏幕呈现的矩形框大小不一样. 先将这个dip换算成px.然后依据屏幕的宽和高的像素计算出矩形区域,传给Surfaceview上铺的