最近开工做项目了,需要前期准备下技术,项目中需要用到Camera的相关技术,偶然在GitHub上发现了这个东西--EasyCamera,使得调用相机的相关操作变得更加简单了。

这样我们先把Github上的文件先clone一下,将zip文件下载下来,然后解压,由于这个项目还是用的Eclipse构建,用Eclipse的用户就可以跳过这一段了。

为了构建方便我们自己新建一个Library的Module,这样走File->New Module到达下面这个页面:

按照图片中选中的点击Next,然后需要给你的Library来一个名字,然后到达这个页面:

选择Add No Activity,然后直接点击Finish即可。这样我们的Library就创建好了。

我想说的是为何这么做?昨天在研究的时候,因为用到了.aar作为EasyCamera的库,并没有找到合适的方法导入.aar文件,导致自己在这个问题上浪费了不少时间,所以还是选择了这样一种方式来引入,方便而且更快捷。

下边就是需要创建我们的工程Module了,在第一张图上点击Phone And Tablet Application的选项,这样一步步创建好就OK了。

然后是在工程中引入我们刚才创建的库,这个不是很麻烦的问题,请参考我的这篇文章Android Studio--引用自己创建的Library

这样基本上万事具备了,我们需要将我们下载的zip文件解压,将下图所示的三个文件拷贝到Library中的java代码位置:

好了这样我们就能正常引用这个EasyCamera的库了。

这时候前期准备工作正式完成。下面我们来写一个相机的实例来感受一下。

首先先附上布局文件activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"><SurfaceViewandroid:id="@+id/camera_preview"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="1"/><Buttonandroid:id="@+id/btn_capture"android:text="Capture"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"/></LinearLayout>

布局文件很简单,不做过多解释,就是一个相机预览和拍照按钮。

然后附上MainActivity.java的代码:

import library.DefaultEasyCamera;
import library.EasyCamera;import android.content.Context;
import android.hardware.Camera;
import android.os.Environment;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class MainActivity extends ActionBarActivity {private SurfaceView mSurfaceView;private SurfaceHolder mSurfaceHolder;private Button capture;/*** 判断是否在预览状态*/private boolean previewIsRunning = false;private EasyCamera mEasyCamera;private EasyCamera.CameraActions mCameraActions;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mSurfaceView = (SurfaceView) findViewById(R.id.camera_preview);capture = (Button) findViewById(R.id.btn_capture);mSurfaceHolder = mSurfaceView.getHolder();mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {@Overridepublic void surfaceCreated(SurfaceHolder holder) {// 开启后置摄像头mEasyCamera = DefaultEasyCamera.open(Camera.CameraInfo.CAMERA_FACING_BACK);// 设置相机翻转角度//  mEasyCamera.setDisplayOrientation(90);// 正常显示相机预览WindowManager manager = (WindowManager) MainActivity.this.getSystemService(Context.WINDOW_SERVICE);mEasyCamera.alignCameraAndDisplayOrientation(manager);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {if(!previewIsRunning && mEasyCamera != null) {try {// 开启预览mCameraActions =  mEasyCamera.startPreview(holder);} catch (IOException e) {e.printStackTrace();}previewIsRunning = true;}}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// 停止预览并释放mEasyCamera.stopPreview();mEasyCamera = null;}});capture.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {EasyCamera.PictureCallback mPictureCallback = new EasyCamera.PictureCallback(){@Overridepublic void onPictureTaken(byte[] data, EasyCamera.CameraActions actions) {// 停止预览mEasyCamera.stopPreview();try {// 延时1000s,看的更加清楚Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// 存储图片的操作FileOutputStream fos = null;try {Log.d("TAG",getExternalFilesDir(Environment.DIRECTORY_PICTURES)+File.separator+"abc.jpg");fos = new FileOutputStream(new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES)
<span style="white-space:pre">              </span>+File.separator+"abc.jpg"));fos.write(data);fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}// 开启预览EasyCamera.Callbacks.create().withRestartPreviewAfterCallbacks(true);try {mEasyCamera.startPreview(mSurfaceHolder);} catch (IOException e) {e.printStackTrace();}}};// 拍摄照片的操作mCameraActions.takePicture(EasyCamera.Callbacks.create().withJpegCallback(mPictureCallback));}});}
}

最后的话需要我们把相应的permission加上,但是我们可以把这个权限加载Library中,这样我们的工程就不需要添加了!权限如下:

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

好了,这样我们来看一下运行效果,

中间发生了一个小错误,就是在运行时点击中间的home键退出时,再次进入程序发生了崩溃的现象,深入查看代码的时候,是自己释放相机的时候考虑的不够周全,现在对于自己的代码做出这样的修改:

 <span style="white-space:pre"> </span>@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {Log.d("TAG","surfaceDestroyed停止并释放");// 停止预览并释放mEasyCamera.stopPreview();mEasyCamera.release();mEasyCamera = null;mCameraActions = null;previewIsRunning = false;}

而且在代码头部mEasyCamera = null,这样修改后,问题就不大了。在修改的过程中,你可能会发现,没有Camera的release的相应代码,这样我们就修改下源代码了。

首先我们在EasyCamera接口中添加release方法,如下:

    /*** 释放相机的方法*/void release();

然后在DefaultCamera中来实现这个方法:

    @Overridepublic void release() {camera.release();}

这样简单的一修改我们就可以在自己的代码中将相机完美的释放了!

怎么样是不是很简单啊?

这里附上我的源代码下载地址。

参考文章:http://techblog.bozho.net/fixing-the-android-camera-api/ 英文好的朋友可以直接过来读!

EasyCamera--更简单更灵活的相机应用编写相关推荐

  1. 通过SQL即可让监控分析更简单更高效

    1.前言 阿里时序时空数据库TSDB最新推出TSQL,支持标准SQL的语法和函数.用户使用熟悉的SQL,不仅仅查询更简单易用,用户还可以利用SQL强大的功能,实现更加复杂的计算分析. 2. 为什么需要 ...

  2. 比KMP算法更简单更快的字符串匹配算法

    我想说一句"我日,我讨厌KMP!". KMP虽然经典,但是理解起来极其复杂,好不容易理解好了,便起码来巨麻烦! 老子就是今天图书馆在写了几个小时才勉强写了一个有bug的.效率不高的 ...

  3. TSQL:让监控分析更简单更高效

    1. 前言 阿里时序时空数据库TSDB最新推出TSQL,支持标准SQL的语法和函数.用户使用熟悉的SQL,不仅仅查询更简单易用,用户还可以利用SQL强大的功能,实现更加复杂的计算分析. 2. 为什么需 ...

  4. 51CTO.com 巅峰访谈:让远程接入访问变得更简单 更高效

    毫无疑问,在远程访问需求方面,SSL VPN技术在与IPsec的竞争中取得了胜利.Gartner报告称SSL VPN将成为大部分商业使用的.主要的远程接入方式.但是随着SSL VPN使用的增加,对接入 ...

  5. Mybatis Plus最新代码生成器AutoGenerator,更简单更高效!

    一.概述 AutoGenerator 是 MyBatis Plus推出的代码生成器,可以快速生成Entity.Mapper.Mapper XML.Service.Controller等各个模块的代码, ...

  6. plotly----比matplotlib更简单更美观的交互式绘图python库

    文章目录 1. plotly介绍 2. 安装plotly Jupyterlab support(python 3.5+) 图片导出工具安装 nodejs相关安装 orca安装 3. 使用plotly ...

  7. 自己写小工具 让工作更简单更效率

    2019独角兽企业重金招聘Python工程师标准>>> DBScarPro_DSTool.exe: #include <stdio.h> #include <std ...

  8. 毒蘑菇搜索,一个更简单更好用的主页。

    经过2周多的时间,利用闲暇时间,周六周日加班加点的写代码,毒蘑菇搜索终于新鲜出炉了,跟站搜搜一样可以根据网站名搜索网站并且一键直达,相当方便呐! 毒蘑菇搜索 操作说明

  9. Kafka Streams简介: 让流处理变得更简单

    Introducing Kafka Streams: Stream Processing Made Simple 这是Jay Kreps在三月写的一篇文章,用来介绍Kafka Streams.当时Ka ...

  10. beautifulsoup网页爬虫解析_Python爬虫神器:PyQuery,解析网页更简单,小白也能学会

    图/文:迷神 我们做python爬虫,通过requests抓取到内容就需要正则匹配,或者其他解析库解析内容.很多可能和我一样的人,都使用jquery的,那用的还是非常爽的.而pyquery库就是jQu ...

最新文章

  1. AOP通过开启注解方式自动注入值
  2. Ninja提升编译速度的方法-Android10.0编译系统(十)
  3. 2020年网站优化思路从哪着手?
  4. linux中rpm命令管理
  5. 好文转载—程序员在工作中会追求什么?
  6. 机器物联网的四大价值流
  7. 这100道Linux常见面试题,看看你会多少?
  8. Centos7 ubuntu 安装Telnet服务
  9. 使用 加载 顺序_SpringBoot系列教程之Bean加载顺序之错误使用姿势辟谣
  10. ubuntu 如何卸载qt_UBuntu14.04下安装和卸载Qt5.3.1
  11. MaxScale Binlog Server实践
  12. Ubuntu的默认root密码是多少,修改root密码
  13. java案例-酒店管理系统(ssm+mysql+nginx)
  14. 各类型数据之间的混合运算
  15. 第一台电子计算机教授领导,第一台电子计算机
  16. 实验三十六 Windows Server 2012 RDS桌面虚拟化之七VDI虚拟桌面的更新和维护
  17. 服务器看门狗芯片电路图,SP706看门狗芯片SP706应用电路图.pdf
  18. 强烈推荐免费在线图片转文字的工具
  19. 1个做了7年外包公司老板的自述
  20. 使用idea手搓java计算器

热门文章

  1. 【转】《Unity Shader入门精要》冯乐乐著 书中彩图
  2. 交换机命令中的正则表达式过滤方式
  3. 防拷贝U盘在软件开发行业的应用,软件怎样防复制防拷贝?
  4. 电阻的寄生电感、寄生电容
  5. 找不到本地计算机策略组,Win10家庭版找不到本地组策略gpedit.msc解决办法
  6. MATLAB中fspecial()函数的用法
  7. 离散求边缘密度_密度梯度理论简介——半导体器件仿真
  8. Fliqlo:一款精致高逼格的翻页时钟屏保软件
  9. Premiere Pro之经典类转场
  10. 计算机打不开网络邻居,打不开网上邻居的电脑是怎么回事