[Android]实现简单的相机程序过年要放假加班到现在我也是醉了
来源:互联网 发布:杀人软件正在播放 编辑:程序博客网 时间:2024/06/12 01:31
好久没写了,有些东西做过都快忘了,赶紧记一下。
现在来实现一个简单的相机程序。
原文地址http://www.cnblogs.com/rossoneri/p/4246134.html
当然需要的话可以直接调用系统的camera程序,但自己实现会使用更自由。
呐,既然要用实现相机,那就需要先了解一下调用camera的类android.hardware.camera
另外补充一下,实现android的video也是使用的Camera API,用到相关的类为Camera,SurfaceView,MediaRecorder,Intent(MediaStore.ACTION_IMAGE_CAPTURE, MediaStore.ACTION_VEDIO_CAPTURE)
好,根据camera的说明,在开始编写程序之前需要确认manifest中添加关于使用摄像设备的适当的权限声明,如果使用camera API必须加上下段说明:
<uses-permission android:name="android.permission.CAMERA" />
当然,程序也需要声明使用camera的特性:
<uses-feature android:name="android.hardware.camera" />
如果需要其他特性,在列表里选择性添加就好,比如一会儿我还需要自动对焦就要添加相关代码到manifest。添加特性代码就是为了防止你的程序被安装到没有摄像头或者不支持你要的功能的设备上去(prevent your application from being installed to devices that do not include a camera or do not support the camera features you specify. )
如果你的程序能通过适当的操作使用camera或一些特性,但并不特别需要它,可以增加required属性为false:
<uses-feature android:name="android.hardware.camera" android:required="false" />
Ok,前面说的有点多,下面说下使用camera的流程:
- 整体流程
- 检测camera的存在并访问camera
- 继承SurfaceView并添加SurfaceHolder接口以显示预览画面
- 为预览画面添加你需要的布局和控件
- 增加对拍照事件的监听
- 使用拍照功能并保存照片
- 最后要释放camera
- 流程细节
- 通过open(int)方法获取camera的实例,int为camera的id
- 使用getParameters()获取相机当前的设置,包括预览尺寸,拍照尺寸等等参数
- 如果修改了相关设置,调用setParameters(Camera.Parameters)将更改的信息重新生效
- 有需要的话使用setDisplayOrientation(int)来改变预览画面的方向
- 使用setPreviewDisplay(SurfaceHolder)传递一个完整初始化的SurfaceHolder,没有surface,就没法启动预览画面
- 在拍照之前先调用startPreview()来更新预览画面
- 调用takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)进行拍照,在回调函数中获得照片对象并做处理
- 预览画面会在拍照后关闭,如果还需要拍照,记得先startPreview()
- 用stopPreview()来关闭预览画面
- camera使用之后一定要调用release()释放掉
下面跟着流程,开始编码
先在主界面添加一个按钮,用来打开相机,效果如下:
设计拍照界面,一个surfaceview用来显示预览画面,两个button进行拍照和返回
编写camera操作的代码,增加了自动对焦,分辨前后摄像头等内容,为了代码看起来连贯,具体说明放在注释里
在MainActivity中添加下面主要代码
在Manifest加入:
<uses-permission android:name="android.permission.CAMERA" /><uses-feature android:name="android.hardware.camera" /><uses-feature android:name="android.hardware.camera.autofocus" />
最后一些资源文件string和color
经过以上步骤,我们的设备就可以用摄像头进行预览了,预览时随意移动设备还可以自动对焦,效果如下图:
不过,这个是用DDMS截的图,如果是拍照,实际画面尺寸会与看到的稍有差别,原因在代码里也有写。
关于拍照takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)的使用也很简单,在回调PictureCallback中重写public void onPictureTaken(byte[] data, Camera camera) {}方法,data就是图片数据,用bitmapfactory来decode一下,再处理一下显示的旋转方向与尺寸就ok了,这部分代码有空再补吧。
好了,又复习一遍这个过程发现还是蛮简单的。多看看官方的文档就好。ok,收工睡觉。
- [Android]实现简单的相机程序过年要放假加班到现在我也是醉了
- 放假了,过年了
- 放假过年了吗
- 放假了,回家过年吧
- 毕业到现在我从事C++程序开发三年了,今天我要离职了
- 现在的我也是曾经的我
- 过年了,妈妈放假了,可以好多天陪我玩了
- 我新开的博客,提醒我现在也是一个做技术的人了。
- 今天加班到现在,吃了个面包,有点无聊,讨厌做这种客户的软件。
- 到现在为止,成功调试完成我的第一个Java程序,意味着我也要进行Java这一行了,请看我的代码!
- 我现在用C语言实现了YUV420到RGB的转换,现在要根据这个C写verilog,怎么写?
- 父母不同意结婚肯定有他们的理由,我现在也总算是明白了,一切也是他们看透了!
- 看到这样的翻译,我也是醉了。。。
- 今天我流泪了,也是我进公司写的第500个程序。
- 2012过年的时间 2012过年放假时间 2012年什么时间过年 2012过年 2012年什么时候过年
- 过年了,异乡漂泊的我也可以回家了^^
- 今天最后一天上班,明天放假过年了,入职来总结
- 今天放假过年了,预祝大家都快乐
- boost源码剖析之:泛型编程精灵type_traits(rev#2)
- 编写可读代码(二) 如何命名
- 在C++中侦测内嵌型别的存在(rev#2)
- 本文实例分析了js正则表达式中的单行模式与多行模式。分享给大家供大家参考
- 本文实例讲述了js中正则的查找match()与替换replace()的用法。
- [Android]实现简单的相机程序过年要放假加班到现在我也是醉了
- 通过JavaScript脚本创建级联下拉列表框
- Hibernate 第一课
- 【css】li中元素错位(与float有关)
- Triangle
- hibernate缓存机制详细分析
- 二叉树先序遍历非递归实现
- 你要实现什么功能呢?javascript是在客户端浏览器环境中执行
- 从零开始debian——debian装机中遇到和解决的问题