Android Camera相机功能实现 拍照并保存图片
AndroidManifest.xml
- <uses-feature android:name="android.hardware.camera"/>
- <uses-feature android:name="android.hardware.camera.autofocus" />
- <uses-permission android:name="android.permission.CAMERA" />
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
activity_main.xml
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/LinearLayout1"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- tools:context=".MainActivity" >
- <Button
- android:id="@+id/btn_camera"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="Camera" />
- <SurfaceView
- android:id="@+id/mySurfaceView"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- />
- </LinearLayout>
MainActivity.java
- public class MainActivity extends Activity {
- private Button btnCamera=null;
- private SurfaceView mySurfaceView =null;
- private Camera cam=null;
- private SurfaceHolder holder=null;
- private boolean previewRunning=false;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- this.btnCamera=(Button)super.findViewById(R.id.btn_camera);
- this.mySurfaceView=(SurfaceView)super.findViewById(R.id.mySurfaceView);
- this.btnCamera.setOnClickListener(new OnClickListenerImpl());
- this.holder=this.mySurfaceView.getHolder();
- this.holder.addCallback(new MySurfaceViewCallback());
- this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- this.holder.setFixedSize(800, 480);
- }
- private class OnClickListenerImpl implements OnClickListener{
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- if(MainActivity.this.cam!=null){
- MainActivity.this.cam.autoFocus(new AutoFocusCallbackImpl());
- }
- }
- }
- private class MySurfaceViewCallback implements SurfaceHolder.Callback {
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width,
- int height) {
- // TODO Auto-generated method stub
- }
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- // TODO Auto-generated method stub
- MainActivity.this.cam=Camera.open(); //取第一个摄像头
- WindowManager manager=(WindowManager)MainActivity.this.getSystemService(Context.WINDOW_SERVICE);
- Display display=manager.getDefaultDisplay();
- Parameters param=MainActivity.this.cam.getParameters();
- param.setPreviewSize(display.getWidth(), display.getHeight());
- param.setPreviewFrameRate(5);//一秒5帧
- param.setPictureFormat(PixelFormat.JPEG);
- param.set("jpeg-quality", 80);
- MainActivity.this.cam.setParameters(param);
- try {
- MainActivity.this.cam.setPreviewDisplay(MainActivity.this.holder);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- MainActivity.this.cam.startPreview();//预览
- MainActivity.this.previewRunning=true;
- }
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- // TODO Auto-generated method stub
- if(MainActivity.this.cam!=null){
- if(MainActivity.this.previewRunning){
- MainActivity.this.cam.stopPreview();
- MainActivity.this.previewRunning=false;
- }
- MainActivity.this.cam.release();//释放摄像头
- }
- }
- }
- private class AutoFocusCallbackImpl implements AutoFocusCallback{
- @Override
- public void onAutoFocus(boolean success, Camera camera) {
- // 对焦操作
- if(success){
- MainActivity.this.cam.takePicture(sc, pc, jpegcall);
- }
- }
- }
- private PictureCallback jpegcall=new PictureCallback() {
- @Override
- public void onPictureTaken(byte[] data, Camera camera) {
- // 保存图片操作
- Bitmap bmp=BitmapFactory.decodeByteArray(data, 0, data.length);
- String fileName=Environment.getExternalStorageDirectory().toString()
- +File.separator
- +"AppTest"
- +File.separator
- +"PicTest_"+System.currentTimeMillis()+".jpg";
- File file=new File(fileName);
- if(!file.getParentFile().exists()){
- file.getParentFile().mkdir();//创建文件夹
- }
- try {
- BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(file));
- bmp.compress(Bitmap.CompressFormat.JPEG, 80, bos);//向缓冲区压缩图片
- bos.flush();
- bos.close();
- Toast.makeText(MainActivity.this, "拍照成功,照片保存在"+fileName+"文件之中!", Toast.LENGTH_LONG).show();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- //e.printStackTrace();
- Toast.makeText(MainActivity.this, "拍照失败!"+e.toString(), Toast.LENGTH_LONG).show();
- }
- MainActivity.this.cam.stopPreview();
- MainActivity.this.cam.startPreview();
- }
- };
- private ShutterCallback sc=new ShutterCallback() {
- @Override
- public void onShutter() {
- // 按下快门之后进行的操作
- }
- };
- private PictureCallback pc=new PictureCallback() {
- @Override
- public void onPictureTaken(byte[] data, Camera camera) {
- // TODO Auto-generated method stub
- }
- };
Android Camera相机功能实现 拍照并保存图片的更多相关文章
- Android Camera 相机程序编写
Android Camera 相机程序编写 要自己写一个相机应用直接使用相机硬件,首先应用需要一个权限设置,在AndroidManifest.xml中加上使用设备相机的权限: <uses-per ...
- 【转】Android Camera 相机开发详解
在Android 5.0(SDK 21)中,Google使用Camera2替代了Camera接口.Camera2在接口和架构上做了巨大的变动, 但是基于众所周知的原因,我们还必须基于 Android ...
- Android 调用摄像头功能【拍照与视频】
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/ma_hoking/article/details/28292973 应用场景: 在Android开发 ...
- android Camera相机类
Camera相机类相关的几个流程方法 Camera.open(cameraId) 打开相机 camera.setDisplayOrientation(0) 设置相机水平方向 mCamera.setPr ...
- Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能
Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...
- Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片
Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一 ...
- Android Camera 拍照 三星BUG总结
Android Camera 三星BUG : 近期在Android项目中使用拍照功能 , 其他型号的手机执行成功了 只有在三星的相机上遇到了bug . BUG详细体现为 : (1) 摄像头拍照后图 ...
- Android开发 Camera2开发_1_拍照功能开发
介绍 google已经在Android5.1之后取消了对Camera1的更新,转而提供了功能更加强大的Camera2.虽然新版本依然可以使用Camera1但是,不管是各种机型适配还是拍照参数自定义都是 ...
- Android 学习笔记之如何实现简单相机功能
PS:看来算法和数据结构还是非常有用的,以后每天都练习两道算法题目...这次忘了对代码进行折叠了..导致篇幅过长... 学习内容: 1.Android如何实现相机功能... 2.如何实现音频的录制.. ...
随机推荐
- innodb事务日志详解
首先看InnoDB的缓存和文件的关系图如下: InnoDB事务日志功能介绍 InnoDB使用日志来减少提交事务时的开销.因为日志中已经记录了事务,就无须在每个事务提交时把缓冲池的脏块刷新(flush) ...
- hdu 5706 GirlCat(BFS)
As a cute girl, Kotori likes playing ``Hide and Seek'' with cats particularly. Under the influence o ...
- PTA 畅通工程之最低成本建设问题(30 分)(最小生成树 krusal)
畅通工程之最低成本建设问题(30 分) 某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路 ...
- Java-Runoob-高级教程:Java MySQL 连接
ylbtech-Java-Runoob-高级教程:Java MySQL 连接 1.返回顶部 1. Java MySQL 连接 本章节我们为大家介绍 Java 如何使用 使用 JDBC 连接 MySQL ...
- JavaScript笔记——DOM的操作
节点及其类型 在JavaScript中,节点分为三种: 元素节点:HTML标签元素. 属性节点: 元素的属性, 可以直接通过属性的方式来操作. 文本节点: 是元素节点的子节点, 其内容为文本. 在什么 ...
- 实战MvcPager(PagerOptions自定义样式&同、异步)
ASP.NET MVC下的分页控件MvcPager用起来简直太嗨呸了,两句代码实现一个分页,而且需要改变样式的时候直接构造PagerOptions类 实战无需多说,拿来用之即可.个人觉得对性能影响不大 ...
- 南京邮电大学网络攻防平台WEB题
平台地址:http://ctf.nuptsast.com/ 签到题: 右键查看源代码,得到flag md5 collision: 传入的a的md5值要为0e开头的,但不能是QNKCDZO,百度一个0e ...
- python's twenty-second day for me 封装,property方法
面对对象的三大特性:继承,多态,封装. 函数和属性装到了一个非全局的命名空间----封装. 封装: 在类中,静态属性,方法,对象属性都可以变成私有的,只需要在这些名字前加上‘__’(双下划线). 在类 ...
- Java的I/O流问题
一.流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. ...
- Python中的 set 与 深浅拷贝
字符串 join() 格式: "拼接的东西".join(可迭代对象) 可以加列表转换成字符串 lis = ['a','b','c','d'] s = "//" ...