前言:由于camera2是在api level 21(5.0)才引入的,而Camera到6.0仍可使用,所以我们这里仍然以Camera为例,但是当需要实现相机的高级功能时,就需要使用Camera2了。此篇为入门篇,只实现了简单的拍照功能,摄像头的内容还是有很多的,后期还会涉及到NDK与C/C++的交互等等。
注意:Android6.0以上需要申请动态权限。我是一个不善于接受新事物的人,很多东西即使自己了解也知道自己应该去学习,可是自己就是不愿意去做。这在日新月异的计算机行业是非常致命的,如果你和我一样一定要注意去提醒自己去改变,否则你会吃很多亏的。这次自己就吃了动态权限的灰。如果你对动态权限毫无所知,请先看我的另一篇文章http://www.jianshu.com/p/448fe4193ee2
一 、调用系统相机
启动另一种程序的两种方式:
①Intent显式启动(需要知道想要启动程序的完整包名)
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName(packageName,className);
intent.setComponent(cn);
startActivity(intent);
//在代码中“packageName”是要打开的程序包名,“className”是要打开的Activity。
或者
②Intent隐式启动(一般调用Camera都是通过隐式启动的)
用startActivityForResult()启动相机,可以回调onActivityResult()方法获取到图片。注意为了防止APP出现OOM(内存溢出)所以通过data获得到的图片只是缩略图,图片的质量很低。
如果想要获取到原图需要我们自己为系统相机拍的照片指定保存路径。
Uri别导入错了,容易导错
用BitmapFactory.decodeStream()解析原文件,然后显示,即可。
二、实现自定义相机
步骤一:自定义相机需要在manifest.xml文件中进行注册
注意增加过滤器的时候要添加一个默认的category,这个过滤器才会生效哦!!!
步骤二:自定义一个Activity ,CustomCamera.java ,这是此Activity的界面布局,点击按钮进行拍摄,SurfaceView显示预览,不了解SurfaceView自己查查,内容太多在此不详述了。
步骤三:首先定义这三个方法,具体作用图片上面的注释解析的很清楚,详细代码下面我会贴出来的。(这里只提供关键代码)
步骤四:将Camera声明周期和Activity的生命周期进行绑定(保证Camera正常的被创建和销毁)
步骤五:将SurfaceView和Camera进行绑定,这样Camera捕捉到的画面就可以预览到SurfaceView中,我们就可以看见了。
因为这是自定义的相机最后不要忘了,申请相机的使用权限,不要忘了,不要忘了,不要忘了!!!
项目源码:http://t.cn/RjKEXBy(因为项目内容比较少,就直接放到word里面了)