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

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

  1. Android开发 Camera2开发_2_预览分辨率或拍照分辨率的计算

    前言 不管在Camera1或者Camera2在适配不同手机/不同使用场景的情况下都需要计算摄像头里提供的分辨率列表中最合适的那一个分辨率.所以在需要大量机型适配的app,是不建议不经过计算直接自定义分 ...

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

    仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...

  3. Android 使用 Camera2 完成预览和拍照

    Android API 21新增了Camera2,这与之前的camera架构完全不同,使用起来也比较复杂,但是功能变得很强大. 在讲解开启预览之前,首先需要了解camera2的几个比较重要的类: Ca ...

  4. Android Camera2 预览,拍照,人脸检测并实时展现

    https://www.jianshu.com/p/5414ba2b5508 背景     最近需要做一个人脸检测并实时预览的功能.就是边检测人脸,边在预览界面上框出来.     当然本人并不是专门做 ...

  5. Android 10开发者预览版功能介绍

    Android P的开发者预览版最亮眼的功能莫过于支持“刘海屏”等屏幕显示.同样在适配可折叠设备方面,Android Q的第一个开发者预览版也很“接地气”,谷歌早在去年11月就发布了对可折叠设备的支持 ...

  6. Webappbuilder开发快速预览

    Webappbuilder开发快速预览 by 李远祥 Webappbuilder for ArcGIS 是由ArcGIS JavaScripit API和dojo创建的,它允许通过创建自己的widge ...

  7. Android远程桌面助手(B1185)for Android P开发者预览版

    Android P的开发者预览版已出,其中App compatibility changes部分特别强调“The platform restricts the use of some non-SDK ...

  8. Windows 10 开发人员预览版中的新增功能(转自 IT之家)

    Windows 10 开发人员预览版中的新增功能 在Win10预览版中安装工具与SDK后,即可着手创建Windows通用应用或先浏览目前的环境与此前相比都发生了什么变化. 应用建模 文件资源管理器: ...

  9. Android 开发 Camera2开发_3_处理预览和拍照偏暗问题

    通过调整曝光解决 参考:https://stackoverflow.com/questions/28429071/camera-preview-is-too-dark-in-low-light-and ...

随机推荐

  1. linux安装ftp服务器

    Ftp(文件传输协议) 概念 FTP是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用 ...

  2. C puzzles详解【34-37题】

    第三十四题 The following times. But you can notice that, it doesn't work. #include <stdio.h> int ma ...

  3. 泛型集合转换为DataTable

    在做项目中,遇到了将集合转换为DataTable的使用,在网上看了资料,在这里记录下来,分享. using System; using System.Collections.Generic; usin ...

  4. Java实现计算20的阶乘

    循环从1乘到20,要注意的就是结果可能会很大,长度超出int类型的范围,所以定义乘积的时候用long. 代码如下: public class Practice3 { public static voi ...

  5. Windows7下CHM电子书打开不能正常显示内容

    Author:KillerLegend Date:2014.1.28 Welcome to my blog:http://www.cnblogs.com/killerlegend/ 今日下载一个CHM ...

  6. C# 文件流基本操作步骤

    private void button1_Click(object sender, EventArgs e) { FileStream fs = new FileStream("123.tx ...

  7. Delphi XE5 for android 图片缩放和拖动处理

    首先,需要分辨手势的类型. 有两种类型的手势: 一是标准手势(Standard Gestures): 在Windows,android上,标准手势都是用一个手指. 在Mac OS X and iOS上 ...

  8. 第六节:宿主如何使用AppDomain

    前面已经讨论了宿主以及宿主加载CLR的方式.同时还讨论了宿主如何告诉CLR创建和卸载AppDomain.为了使这些讨论更加具体,下面将描述一些常见的宿主和AppDomain使用情形.特别地,我要解释不 ...

  9. python中读取配置文件ConfigParser

    在程序中使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是ConfigParser,这里简单的做一些介 ...

  10. shell字符串的截取

    1.变量 var 从 npos ∈ [0, length-1] 位开始,从左->右截取 num 个字符: ${var:npos:num} / ${var:npos} 小结:若 npos < ...