我们有个需求,在机器上加个摄像头,定时拍照;

我到网上搜索,发现没有快速上手和简单使用的;

个人感觉,大部分博客写得很乱,或者长篇大论;

而我只想简单实现功能,并不打算学习多少理论;

下面代码是我写来测试的,大家有需要可以参考;

能快速看到效果,实际使用可在这个基础上扩展。


先看下我使用的硬件,Android板和摄像头,如图:

首先我想说一下 SurfaceView 这个东西,这个是你希望在界面上看到摄像头拍到的内容(就是所谓“预览”)时才需要,如果你不需要预览可以不用它,不用它照样可以取得摄像头数据。

下面是我主要代码,大家看下一就明白,不用解析了,如下:

package com.wongo.test.CommCamera;import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import java.util.List;public class WGCameraManage {Camera mCamera;SurfaceTexture mSurfaceTexture = new SurfaceTexture(0);/*** 打开摄像头* @param cameraId 如:Camera.CameraInfo.CAMERA_FACING_BACK* @param surfaceHolder 用于预览的SurfaceHolder,可为null* @param previewCallback 预览回调,可为null* @return 返回null表示成功,其它表示具体错误信息*/public String openCamera(int cameraId, SurfaceHolder surfaceHolder, Camera.PreviewCallback previewCallback) {releaseCamera();// 判断是否存在cameraId的相机boolean isExistCamera = false;Camera.CameraInfo info = new Camera.CameraInfo();for (int i = 0; i < Camera.getNumberOfCameras(); i++) {Camera.getCameraInfo(i, info);if (info.facing == cameraId) {isExistCamera = true;break;}}if (isExistCamera) {//初始化相机配置信息try {mCamera = Camera.open(cameraId);int width = 0;int height = 0;Camera.Parameters mParameters = mCamera.getParameters();List<Camera.Size> sizeList = mParameters.getSupportedPreviewSizes();// 找到支持的最大尺寸for(int i = 0; i < sizeList.size(); i++) {Camera.Size size = sizeList.get(i);if (size.width > width) {width = size.width;height = size.height;}}//设置预览尺寸mParameters.setPreviewSize(width, height);//设置保存图片尺寸mParameters.setPictureSize(width, height);//设置图片质量为50//mParameters.setJpegQuality(50);mCamera.setParameters(mParameters);// 设置预览回调if (previewCallback != null) {mCamera.setPreviewCallback(previewCallback);}} catch (Exception e) {return "相机初始化失败:"+e.getLocalizedMessage();}// 开始预览try {if (surfaceHolder != null) {mCamera.setPreviewDisplay(surfaceHolder);} else {mCamera.setPreviewTexture(mSurfaceTexture);}mCamera.startPreview();} catch (Exception e) {return "打开预览出错:"+e.getLocalizedMessage();}} else {return "没找到对应相机";}return null;}/*** 拍照* @param callback*/public void takePicture(final takePictureCallback callback) {if (mCamera == null) {if (callback != null) { callback.onError("相机未初始化成功"); }return;}try {mCamera.takePicture(null, null, null, new Camera.PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {if (callback != null) {callback.onSuccess(data);}mCamera.startPreview();}});} catch (Exception e) {if (callback != null) {callback.onError(e.getLocalizedMessage());}}}/*** 释放相机*/public void releaseCamera() {if (mCamera != null) {mCamera.stopPreview();mCamera.setPreviewCallback(null);mCamera.release();mCamera = null;}}/*** 拍照回调*/public interface takePictureCallback {void onSuccess(byte[] data);void onError(String errMsg);}}

使用的话,就是创建WGCameraManage对象,调用openCamera方法,如果要保存照片就调用takePicture方法。

下面发一下,我测试使用的Activity代码,如下:

package com.wongo.test;import android.hardware.Camera;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;import com.wongo.test.CommCamera.WGCameraManage;
import com.wongo.test.common.MyFileUtils;import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;public class CameraActivity extends AppCompatActivity {WGCameraManage mCameraManage = new WGCameraManage();String pictureSaveRoot; // 照片保存的目录@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_camera);// 保存路径pictureSaveRoot = MyFileUtils.getSDCardPath("wongo/camera");File f = new File(pictureSaveRoot);if (!f.exists()) {f.mkdirs();}boolean isNeedPreview = true; // 是否需要预览if (isNeedPreview) {// 创建预览对象SurfaceView mSurfaceView = findViewById(R.id.surfaceView);SurfaceHolder mSurfaceHolder = mSurfaceView.getHolder();mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {@Overridepublic void surfaceCreated(SurfaceHolder holder) {setupCamera(holder); //注意:要在这里调用}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}});} else {// 不需要预览,直接使用setupCamera(null);}}private void setupCamera(SurfaceHolder holder) {// 打开相机String errMsgForOpen = mCameraManage.openCamera(Camera.CameraInfo.CAMERA_FACING_BACK, holder, null);if (errMsgForOpen == null) {// 定时拍照Timer mTimer = new Timer();TimerTask mTask = new TimerTask() {@Overridepublic void run() {mCameraManage.takePicture(new WGCameraManage.takePictureCallback() {@Overridepublic void onSuccess(byte[] data) {savePictureToFile(data);}@Overridepublic void onError(String errMsg) {alert("拍照失败:"+errMsg);}});}};mTimer.schedule(mTask, 10*1000, 10*1000);} else {alert(errMsgForOpen);}}private void savePictureToFile(byte[] data) {try {long millTime = System.currentTimeMillis();SimpleDateFormat dataFormat = new SimpleDateFormat("yyyyMMdd"+File.separator+"HH", Locale.getDefault());String saveDir = pictureSaveRoot + File.separator + dataFormat.format(millTime);File f = new File(saveDir);if (!f.exists()) {f.mkdirs();}SimpleDateFormat nameFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault());String savePath = saveDir + File.separator + nameFormat.format(millTime) + ".jpg";FileOutputStream fos = new FileOutputStream(savePath);fos.write(data);fos.close();alert("保存照片完成");} catch (Exception e) {e.printStackTrace();alert("保存照片出错:"+e.getLocalizedMessage());}}private void alert(final String msg) {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(CameraActivity.this, msg, Toast.LENGTH_SHORT).show();}});}@Overrideprotected void onDestroy() {mCameraManage.releaseCamera();super.onDestroy();}}

还有权限声明,我这项目是测试专用的,本来就声明了各种权限,我看了下,相关的应该是下面这些:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" /><uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />

----------------------------完--------------------------

Android Camera相机开发示例、Android 开发板 USB摄像头采集、定期拍照、定时拍照,安卓调用摄像头拍照、Android摄像头预览、监控,USB摄像头开发、摄像头监控代码相关推荐

  1. java支持arm64吗_VS2017预览版现已支持开发ARM64的UWP

    原标题:VS2017预览版现已支持开发ARM64的UWP IT之家10月5日消息 今天,微软在其官方博客宣布,Visual Studio Version 15.9的第三个预览版已经发布.此版本的Vis ...

  2. 【转】Android Camera 相机开发详解

    在Android 5.0(SDK 21)中,Google使用Camera2替代了Camera接口.Camera2在接口和架构上做了巨大的变动, 但是基于众所周知的原因,我们还必须基于 Android ...

  3. Android camera相机开发拍照功能

    在Android 5.0(SDK 21)中,Google使用Camera2替代了Camera接口.Camera2在接口和架构上做了巨大的变动,但是基于众所周知的原因,我们还必须基于 Android 4 ...

  4. Android Camera相机预览,拍照 ,横屏竖屏的处理

    功能分别是: 1.竖屏的前置,后置显示 加 拍照 2.横屏的前置,后置显示 加 拍照 整个项目的代码贴出来了,里面加了有备注,不理解的也可以去参考官网点击跳转到官网 首先选择前置后置布局效果如下 布局 ...

  5. Android Camera相机基础使用

    前言 拍照功能在智能机中已经是标配了,市场上也充斥着形形色色的相机应用,足以说明相机功能目前的火爆程度.作为Android开发者拍照相关的API也是程序员必备的技能,现在就来学习一下Android系统 ...

  6. android camera hal3 分析,HAL3 enabler下载-HAL3 enabler(开启camera2 api)下载v5.0 安卓版-西西软件下载...

    HAL3 enabler(开启camera2 api)让你无需Magisk模块就能够轻松的开启手机当中的camera2 api功能.对于想要将手机当中的相机功能玩出更多花样的人来说,这绝对是一款极为便 ...

  7. arr 安卓调用qmui_QMUI(Android)炒鸡简单的配置详解

    最近由于工作紧张,没有更新博客,通过几个项目经验,小哥儿又准备了一大波Android开发技能跟大家分享. 来不及解释了,准备好了嘛?快上车! 1. QMUI已开源,页面开发新技能,腾讯出品,必属精品. ...

  8. android新emoji表情符号,安卓7.0全新emoji表情符号预览:更像人了

    Android系统的缺点可能多到你三天三夜也数不完,其中有一个多年来一直"雄踞"这份不光彩榜单的前列,那就是其看起来黏糊糊一团的emoji表情.这些表情符号完全难以辨识,在跨平台交 ...

  9. elementUi中的el-upload上传文件后换封面功能及预览大图结合el-image开发

    一.el-upload上传后换封面 原始效果如下: (上传图片时正常显示图片封面,但是上传其他格式文件时,没有封面,只有一个小的缩略默认图片) 预期效果如下: (上传图片->显示图片.上传pdf ...

最新文章

  1. java 流转文件_java 实现 word 文档的在线编辑以及流转
  2. BugKuCTF WEB web基础$_POST
  3. 伦茨8400变频器面板按键说明_变频器调试笔记
  4. 【TensorFlow-windows】投影变换
  5. 拿什么拯救你,我的面试之——从零打卡刷Leetcode(No.003)
  6. angular8实现对象数组根据某个属性排序(多个也可以)
  7. SegIntersect
  8. mysql查看数据库表大小语句_MySQL查看数据库表容量大小的命令语句讲解
  9. 从浏览器启动客户端程序的方法
  10. 计算机网络是几级学科,教育部更新学科目录 “网络空间安全”增设为一级学科...
  11. 帆软日期格式转换_FineReport中日期时间函数使用总结
  12. 51 nod 1682 中位数计数
  13. ios 扇形 按钮_iOS开发教程之扇形动画的实现
  14. Some selectors are not allowed in component wxss, including tag name selectors, ID selectors,and...
  15. APP开发所需时间,看完这些你就懂了
  16. 消费者应该如何回收处理电子垃圾?
  17. setup facatory9.0打包详细教程(含静默安装和卸载)
  18. 机械工程基础知识点汇总
  19. 做系统注意点磁盘分区三:esp和msr
  20. ESP32使用外设RMT控制WS2812灯条

热门文章

  1. IDL文件读写(七)
  2. for of与for in的区别
  3. 常用数据库有哪些(附带数据库排名)?
  4. 计量经济学:异方差性
  5. 模拟实现简单的自动售货系统
  6. SourceMap 浏览器控制台报错:DevTools failed to load SourceMap:Could not load content for ...
  7. ARM - Linux嵌入式C/C++各种资料分享【更新日期:2012/04/24】
  8. 未来可期(关于高考和现在处境的看法)
  9. 激光三角测量(sheet of light)halcon示例详解 Reconstruct_Connection_Rod_Calib.hdev 模型三维重建...
  10. HBUILDERX怎么导入html文件,HBuilderX使用教程 HBuilderX如何导入图片