EasyCamera--更简单更灵活的相机应用编写
最近开工做项目了,需要前期准备下技术,项目中需要用到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--更简单更灵活的相机应用编写相关推荐
- 通过SQL即可让监控分析更简单更高效
1.前言 阿里时序时空数据库TSDB最新推出TSQL,支持标准SQL的语法和函数.用户使用熟悉的SQL,不仅仅查询更简单易用,用户还可以利用SQL强大的功能,实现更加复杂的计算分析. 2. 为什么需要 ...
- 比KMP算法更简单更快的字符串匹配算法
我想说一句"我日,我讨厌KMP!". KMP虽然经典,但是理解起来极其复杂,好不容易理解好了,便起码来巨麻烦! 老子就是今天图书馆在写了几个小时才勉强写了一个有bug的.效率不高的 ...
- TSQL:让监控分析更简单更高效
1. 前言 阿里时序时空数据库TSDB最新推出TSQL,支持标准SQL的语法和函数.用户使用熟悉的SQL,不仅仅查询更简单易用,用户还可以利用SQL强大的功能,实现更加复杂的计算分析. 2. 为什么需 ...
- 51CTO.com 巅峰访谈:让远程接入访问变得更简单 更高效
毫无疑问,在远程访问需求方面,SSL VPN技术在与IPsec的竞争中取得了胜利.Gartner报告称SSL VPN将成为大部分商业使用的.主要的远程接入方式.但是随着SSL VPN使用的增加,对接入 ...
- Mybatis Plus最新代码生成器AutoGenerator,更简单更高效!
一.概述 AutoGenerator 是 MyBatis Plus推出的代码生成器,可以快速生成Entity.Mapper.Mapper XML.Service.Controller等各个模块的代码, ...
- plotly----比matplotlib更简单更美观的交互式绘图python库
文章目录 1. plotly介绍 2. 安装plotly Jupyterlab support(python 3.5+) 图片导出工具安装 nodejs相关安装 orca安装 3. 使用plotly ...
- 自己写小工具 让工作更简单更效率
2019独角兽企业重金招聘Python工程师标准>>> DBScarPro_DSTool.exe: #include <stdio.h> #include <std ...
- 毒蘑菇搜索,一个更简单更好用的主页。
经过2周多的时间,利用闲暇时间,周六周日加班加点的写代码,毒蘑菇搜索终于新鲜出炉了,跟站搜搜一样可以根据网站名搜索网站并且一键直达,相当方便呐! 毒蘑菇搜索 操作说明
- Kafka Streams简介: 让流处理变得更简单
Introducing Kafka Streams: Stream Processing Made Simple 这是Jay Kreps在三月写的一篇文章,用来介绍Kafka Streams.当时Ka ...
- beautifulsoup网页爬虫解析_Python爬虫神器:PyQuery,解析网页更简单,小白也能学会
图/文:迷神 我们做python爬虫,通过requests抓取到内容就需要正则匹配,或者其他解析库解析内容.很多可能和我一样的人,都使用jquery的,那用的还是非常爽的.而pyquery库就是jQu ...
最新文章
- AOP通过开启注解方式自动注入值
- Ninja提升编译速度的方法-Android10.0编译系统(十)
- 2020年网站优化思路从哪着手?
- linux中rpm命令管理
- 好文转载—程序员在工作中会追求什么?
- 机器物联网的四大价值流
- 这100道Linux常见面试题,看看你会多少?
- Centos7 ubuntu 安装Telnet服务
- 使用 加载 顺序_SpringBoot系列教程之Bean加载顺序之错误使用姿势辟谣
- ubuntu 如何卸载qt_UBuntu14.04下安装和卸载Qt5.3.1
- MaxScale Binlog Server实践
- Ubuntu的默认root密码是多少,修改root密码
- java案例-酒店管理系统(ssm+mysql+nginx)
- 各类型数据之间的混合运算
- 第一台电子计算机教授领导,第一台电子计算机
- 实验三十六 Windows Server 2012 RDS桌面虚拟化之七VDI虚拟桌面的更新和维护
- 服务器看门狗芯片电路图,SP706看门狗芯片SP706应用电路图.pdf
- 强烈推荐免费在线图片转文字的工具
- 1个做了7年外包公司老板的自述
- 使用idea手搓java计算器